我有一个使用Express.js框架构建的Node.js应用程序。应用中的所有路线均为发布路线,即。
app.post('/login', function(req, res){
//do login validation
});
app.post('/AppHomepage', function(req, res){
//send user app dashboard
});
etc.
我遇到的一个问题是,如果用户输入了未定义的路线,例如appdomain.com/thisroutedoesnotexist,它们将被返回“无法获取/ thisroutedoesnotexist”
因此,我遵循了以下答案中的建议:https://stackoverflow.com/a/25216843并添加了
app.get('*', function(req, res) {
res.redirect('/');
});
作为最后一条路线。对于将未定义的请求重定向到索引页并解决此问题,此方法非常好。
但是,我发现发出LEGITIMATE请求时也会调用此通配符重定向。即。如果用户请求/ AppHomepage,则两者
app.post('/AppHomepage', function(req, res){
//send user app dashboard
});
AND
app.get('*', function(req, res) {
res.redirect('/');
});
捕获并响应该请求。用户确实确实获得了正确的主页渲染,但是索引路由内的console.log也正在打印,这意味着即使在app.post('/ AppHomepage')路由具有拿起并满足了请求。
有人能解释为什么会发生这种情况吗?
编辑:
我现在知道,即使浏览器发出的POST请求也将是GET,这就是GET通配符在重定向中使用的原因。
我的问题现在是否有办法仅重定向未定义的请求,而不重定向所有GET请求?
答案 0 :(得分:0)
如果您正在浏览器中进行测试,则默认情况下,所有请求都将是“ GET”请求,并且您已经说过所有请求均为“ POST”类型,因此请尝试使用邮递员或其他类似的api测试工具
答案 1 :(得分:0)
[已解决]
因此,某些浏览器发现此问题是恶意的次要网站图标请求。最初定义的请求确实确实是由相应的路由处理程序处理的,但是某些浏览器(例如Google Chrome)倾向于发送次要的图标请求,这些请求与用户发起的请求分开并告知用户。
这是未定义的请求,并由最终的通配符路由器接收。没有此类流氓行为的浏览器包括macOS上的Apple Safari,并说明了此问题不能100%重现的原因。
解决方案是创建一个空的favicon路由器来处理此类请求,前提是该请求来自浏览器,该浏览器具有非用户启动的行为,例如Google Chrome。