我正在使用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
和myapp.com/lessons/
时,我会得到两个不同的页面(其中一个有我之前在Disqus中添加的评论,另一个没有评论)。
有没有一种方法可以使我所有的网址都不带斜杠呢?我试过添加strict routing
标志来表示,但是结果是一样的
谢谢
8条答案
按热度按时间sf6xfgos1#
The answer by Tolga Akyüz是令人鼓舞的,但如果斜杠后面有任何字符,则不起作用。例如,
http://example.com/api/?q=a
被重定向到http://example.com/api
而不是http://example.com/api?q=a
。下面是一个改进的中间件版本,它通过在重定向目标URL的末尾添加原始查询来解决这个问题。该版本还具有一些安全特性,如更新说明所述。
**更新2016:**如jamesk和RFC 1738中所述,只有在域后面没有内容时才能省略尾部斜杠。因此,
http://example.com?q=a
是无效URL,而http://example.com/?q=a
是有效URL。在这种情况下,不应进行重定向。幸运的是,表达式req.path.length > 1
解决了这一问题。例如,给定URLhttp://example.com/?q=a
,路径req.path
等于/
,因此避免了重定向。**更新2021:**Matt发现,路径开头的双斜杠
//
会导致危险的重定向。例如,URLhttp://example.com//evil.example/
创建了一个指向//evil.example
的重定向,受害者的浏览器会将其解释为http://evil.example
或https://evil.example
。此外,货车Quyet指出,可以有多个尾部斜杠,应妥善处理。由于这些发现,我添加了一行,通过将所有后续斜杠替换为单个/
来保护路径。我相信由于the regexp literals are only compiled once,保护措施导致的性能开销可以忽略不计。此外,代码语法已更新为ES6。sycxhyv72#
尝试添加一个中间件;
pcww981p3#
connect-slashes中间件是专门为这一需求而设计的:https://npmjs.org/package/connect-slashes
安装时:
$ npm install connect-slashes
阅读完整文档:https://github.com/avinoamr/connect-slashes
qcuzuvrc4#
我添加这个答案是因为我对其他解决方案有太多的问题。
这将转化为:
dwthyt8l5#
一个内衬:
这将只捕捉需要重定向的网址,并忽略其他。
示例结果:
nxowjjhe6#
上面的答案在很多情况下都有效,但是GET变量会遇到问题,如果你把它放在另一个express中间件中,它对
req.path
的依赖会导致问题,它对req.url
的依赖也会产生不必要的副作用。它总是乐于使用GET变量,如果您将其放入中间件中,它也不会中断。
oyt4ldly7#
示例结果:
cgfeq70w8#
如果您使用fastify来处理路线,可以尝试将Fastify的ignoreTrailingSlash选项设置为true。