Express抛出404是否在URL中有点
假设我有一个由npm run dev commend(标准,官方样板)运行的Vue2应用程序。我正在使用vue-router通过应用程序提供路由。
我有一些来自搜索引擎的遗留网址,其中包含我的应用程序旧版本的地址,例如/foo,123,bar,456,baz.html
我必须支持这些类型的链接。我是在Vue那边做的(路径如:/foo,:foo,bar,:bar,baz.html
但我遇到了问题 - Express服务器返回404 - 无法获取/foo,123,bar,456.baz.html
我做了一些挖掘,我发现了一些解决方案,比如将连接重写添加到连接历史记录api-fallback
rewrites: [
{
from: /^\/.*$/,
to: function(ctx) {
return ctx.parsedUrl.pathname.replace('.html', '');
}
}
],
它有帮助...但没有解决问题......
将GET /foo,123,bar,456,baz.html重写为/ foo,123,bar,456,baz
但...
Express仍尝试查看/foo,123,bar,456,baz.html并返回404。
有任何想法吗?
回答如下:免责声明:这不是我的专业领域,因此无法保证这个答案的效果如何。
在服务器文件的顶部,尝试放置一个将重定向到正确URL的请求处理程序。更具体地说,首先是app.use
的所有其他实例,放一个这样的处理程序:
app.use((req, res, next) => {
var url = new URL(req.protocol + '://' + req.get('host') + req.originalUrl);
// "get full URL" code from https://stackoverflow/a/10185427/2846923
if (url.pathname.endsWith('.html') /* or whatever other condition fits your needs */) {
url.pathname = url.pathname.slice(0, -5);
res.redirect(301, url.href)
} else {
next();
}
});
这将...
- 拦截所有请求。
- 如果它与您的旧网址匹配,请重定向到新网址。
- 如果不匹配,请继续,就好像我们从未截获该请求一样。
这样做的好处是搜索引擎最终应该流行起来,并列出新的URL代替旧的URL。在将来的某个时刻,对旧URL的所有引用都将不复存在。此时,您将能够删除重定向处理程序,除了手动硬编码链接到旧URL之外,几乎没有负面影响。