我正在使用 Node.js 和 Express,并且有以下路由:
app.get('/', function(req,res){
locals.date = new Date().toLocaleDateString();
res.render('home.ejs', locals);
});
function lessonsRouter (req, res, next)
{
var lesson = req.params.lesson;
res.render('lessons/' + lesson + '.ejs', locals_lessons);
}
app.get('/lessons/:lesson*', lessonsRouter);
function viewsRouter (req, res, next)
{
var controllerName = req.params.controllerName;
res.render(controllerName + '.ejs', locals_lessons);
}
app.get('/:controllerName', viewsRouter);
我有一个Disqus我的课程页面上的小部件,我注意到一个奇怪的行为,当去myapp.com/lessons
and myapp.com/lessons/
我得到两个不同的页面(其中一个有我之前在 Disqus 中添加的评论,另一个没有评论)。
有没有办法“规范”我的所有网址,使其不带尾部斜杠?我尝试添加strict routing
flag来表达但结果是一样的
Thanks
答案 by 托尔加·阿克尤兹很鼓舞人心,但如果斜杠后面有任何字符则不起作用。例如http://example.com/api/?q=a
被重定向到http://example.com/api
代替http://example.com/api?q=a
.
下面是建议的中间件的改进版本,它通过将原始查询添加到重定向目标 URL 的末尾来解决该问题。该版本还具有更新说明中描述的一些安全功能。
app.use((req, res, next) => {
if (req.path.slice(-1) === '/' && req.path.length > 1) {
const query = req.url.slice(req.path.length)
const safepath = req.path.slice(0, -1).replace(/\/+/g, '/')
res.redirect(301, safepath + query)
} else {
next()
}
})
2016 年更新:正如所指出的jamesk并在RFC 1738,只有当域后面没有任何内容时才可以省略尾部斜杠。所以,http://example.com?q=a
是一个无效的 URL,其中http://example.com/?q=a
是有效的。在这种情况下,不应进行重定向。幸运的是,表达式req.path.length > 1
照顾这个。例如,给定 URLhttp://example.com/?q=a
, 路径req.path
等于/
从而避免了重定向。
2021 年更新:正如发现的Matt, 双斜杠//
在路径的开头会导致危险的重定向。例如网址http://example.com//evil.example/
创建一个重定向到//evil.example
这被解释为http://evil.example
or https://evil.example
通过受害者的浏览器。另外,注意到范奎特,可以有多个应该妥善处理的尾部斜杠。由于这些发现,我添加了一行,通过将所有后续斜杠替换为单个斜杠来保护路径/
。我相信防护措施造成的性能开销可以忽略不计,因为正则表达式文字仅编译一次。此外,代码语法更新为ES6。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)