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

时间:2016-01-01 12:54:39

标签: javascript node.js redirect

我有一个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' + '/');
});

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

我该怎么做? 谢谢!

编辑:

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

5 个答案:

答案 0 :(得分:11)

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

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
});

答案 1 :(得分:4)

您可以使用名为express-slash的第三方库来实现此目的。您需要做的就是,

首先,安装库

$ npm install express-slash

然后,将这些添加到您的app.js。

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

app.use(slash()); // set slash middleware

然后,这是你的路由器。

router.get('/:user/', function(req, res) {
    // do your stuff
});

希望它对你有用。

答案 2 :(得分:2)

在“ express.static” use之后和其他use方法之前设置此use

此代码从路径末尾删除斜杠(如果存在的话),并重定向到新的URL。

如果您要添加斜杠,则可以对其进行更改,以便在原始路径没有包含一个斜杠的情况下添加一个斜杠。

app.use((req, res, next) => {
    let url = parseURL(req.url),
        pathname = url.pathname,
        search = url.search || '',
        hasSlash = pathname.charAt(pathname.length - 1) === '/';

    if (hasSlash && pathname !== '/') {
        // remove slash
        pathname = pathname.slice(0, -1);
        // redirect to truest url
        res.redirect(301, pathname + search);
    } else {
        return next();
    }
});

答案 3 :(得分:0)

我将此答案添加为一个完整的解决方案,将非斜杠路线重定向为以斜线结束。

首先,启用严格路由器(v4 +)以禁用自动规范化。

express.Router({strict: true});

然后用一个全能路由启动你的路由器,它检测它是否以斜杠结束 - 在这种情况下也省略了带(。)的任何东西 - 所以不会捕获图像等。

var url = require('url');
router.all(/^[^.]*[^\/]$/, function(req, res) {
    let u = url.parse(req.originalUrl);
    return res.redirect(301, u.pathname + '/' + (u.search || ''));
});

这适用于查询字符串参数等。

答案 4 :(得分:0)

您可以尝试jncraton's answer,但只能在目录中添加斜杠。

const path = require('path')

app.get('/*', function(req, res) {
    if (!req.url.endsWith('/') && !path.extname(req.url)) {
        res.redirect(301, req.url + '/')
    }
}