Node.js重定向有/无尾随斜杠

use*_*706 7 javascript redirect node.js

我有一个javascript根据URL做不同的事情.为了工作,我需要有一致的URI.

例如,我需要用户始终打开www.site.com/users/bob/而不是www.site.com/users/bob

不幸的是,节点似乎不支持它.

我尝试重定向

router.get('/:user', function(req, res) {
    res.redirect('/users/' + req.params.user' + '/');
});
Run Code Online (Sandbox Code Playgroud)

但它只会导致重定向循环,因为带有和不带斜杠的URL似乎都被视为相同.

我怎样才能做到这一点?谢谢!

编辑:

我想从WITHOUT斜线路由到斜线.另一个问题的答案解决了另一种方式.我不能.substr(-1)我的网址

jnc*_*ton 14

如果其他人正在寻找快速零依赖解决方案,这对我来说很好:

app.get('/:page', function(req, res){
  // Redirect if no slash at the end
  if (!req.url.endsWith('/')) {
    res.redirect(301, req.url + '/')
  }

  // Normal response goes here
});
Run Code Online (Sandbox Code Playgroud)

  • 这显然是更好的答案,应该标记为正确.人们不应该总是依赖于最小的东西的依赖. (7认同)
  • 您是否正在考虑路径之后的查询? (2认同)
  • @AlexanderFuchs在我看来,已接受的答案考虑了重定向循环和查询字符串,因此可以更彻底地解决该问题。我也讨厌2行代码段库,但是没有子依赖项,如果您查看[github源码](https://github.com/ericf/express-slash/blob/master/index .js)这两种方法(片段和库)都有其优缺点,我想这都取决于程序员的要求。 (2认同)

Ark*_*ung 3

您可以通过使用名为express-slash的第三方库来获取此内容。您需要做的就是,

首先,安装库

$ npm install express-slash
Run Code Online (Sandbox Code Playgroud)

并且,将这些添加到您的 app.js 中。

var slash   = require('express-slash');

app.use(slash()); // set slash middleware
Run Code Online (Sandbox Code Playgroud)

那么,这就是您的路由器。

router.get('/:user/', function(req, res) {
    // do your stuff
});
Run Code Online (Sandbox Code Playgroud)

希望它对您有用。