在我的应用程序中,来自浏览器的所有查询都带有" / _ / *"转到我的静态文件夹:
app.use('/_', express.static(path.join(__dirname, '_')));
然后所有GET转到/转到HTML文件(HTML5 mode中的单页应用程序):
app.get('/*', function(req, res) {
//some request preprocessing in done here...
hbs.render(path.join(__dirname + '/apps/home.html')).then(function (data) {
res.send(data);
});
});
除非缺少静态文件,否则这很有用。如果我的HTML调用' / _ / iDontExist.js',则来自express的静态中间件找不到该文件并传播由app.get('/*'
匹配的事件。
这是不正确的,如果网址以' / _'开头,我希望Angular回复404。并且文件不存在,而不是尝试将URL与我链中的其他路径匹配。
答案 0 :(得分:0)
更改app.get('/*'
,以便在网址无法解析为真实网页时发送404。
嗯,这就是简单的答案。
您可能正在使用历史记录API编写SPA,该API旨在让您将SPA中的网址映射到真实网址。
这是一个很棒的设计,因为它允许您在直接请求页面时生成相同的HTML,或者在使用JS修改一个页面将其转换为另一个页面时动态更新URL。 (这使您可以进行动态更改,仅修改DOM的一小部分以提高性能)。
如果您没有正确实施并忘记服务器,就会遇到问题。
有一个令人讨厌的趋势(Angular的文档告诉你这样做没有帮助!)将每个URL放到相同的,几乎是空的HTML文档,并依赖于JS生成所有内容。
这意味着您将失去初始页面加载包含所有内容的性能优势。
您失去了不支持JS查看页面的客户的能力。
当JS失败for whatever reason时,你就失去了后备。
你最终会得到一堆重复的网址,这些网址都指向同一个无内容页面(对搜索引擎来说可能不是很好吃)。
如果您没有从服务器提供真实页面,您可能也在使用hashbangs。虽然他们有lots of problems,但使用没有系统服务器端部分的历史API会分享这些问题并引入更多问题。
所以,良好的解决方案是构建代码的服务器端(你应该调查术语"同构js")然后你可以{{1}对于任何找不到的页面。
不太好的解决方案是切换到使用hashbag并将404
更改为'/*'
使用历史记录API的脏问题就是只检查'/'
处理程序中的网址,如果它以/*
答案 1 :(得分:0)
您可以创建自己的小型中间件 - 例如:
app.use('/_', express.static(path.join(__dirname, '_')));
var dontAcceptUnderscorePath = function(req, res, next){
if(req.url.startsWith('/_'))
res.status(404).send();
else
next();
}
app.get('/*', dontAcceptUnderscorePath, function(req, res) {
//some request preprocessing in done here...
hbs.render(path.join(__dirname + '/apps/home.html')).then(function (data) {
res.send(data);
});
});
答案 2 :(得分:0)
请勿将重定向内容与以_
开头的index.html匹配。
app.get(/^[^_].*$/, function(req, res) { // or perhaps /^(?!_).*$/
});
然后处理下面的404.