【问题标题】:Node.js redirect with/without trailing slashNode.js 重定向带/不带斜杠
【发布时间】:2016-04-06 00:12:28
【问题描述】:

我有一个 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 slash 路由到 WITH slash。 另一个问题的答案正好相反。 我不能 .substr(-1) 我的网址

【问题讨论】:

  • 不,警官。这是另一种方式
  • 你可以使用相同的方法,但是做相反的事情...检查是否有尾部斜杠,如果没有,通过添加尾部斜杠来重定向。
  • 嗯,这正是我所说的行不通

标签: javascript node.js redirect


【解决方案1】:

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

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

【讨论】:

  • 这显然是更好的答案,应该标记为正确。人们不应该总是依赖于最小的事情。
  • 您是否考虑在路径后查询?
  • @AlexanderFuchs 在我看来,接受的答案更彻底地解决了问题,因为它考虑了重定向循环和查询字符串。我也讨厌 2 行 sn-p 库,但是没有子依赖项,如果您查看 github source,这里还有更多内容取决于程序员的要求。
  • 这对于不接受 URL 参数的页面来说是一个很好的解决方案,至少。 ETA:或者它会,除非在子应用程序中您可以注册为app.use("/path/to/sub/", sub),然后当用户访问/path/to/sub 时,您的处理程序将使用req.url == "/" 调用。我必须检查req.originalUrl,在更高级别注册中间件可能更容易。
  • 实际上重定向到req.url 无论如何都不适用于子应用程序,因为重定向是相对于域根目录,而不是子应用程序根目录。你也需要originalUrl(或从baseUrl计算的东西)。
【解决方案2】:

您可以使用名为 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
});

希望对你有用。

【讨论】:

  • 我想更多的是一个简短的 sn-p 而不需要外部中间件,但这必须这样做。谢谢!
【解决方案3】:

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

首先,启用严格路由器 (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】:

    将此 use 设置在 'express.static' 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();
        }
    });
    

    【讨论】:

    • 等等,什么,charAt?那是你只能在博物馆里找到的东西。
    【解决方案5】:

    您可以尝试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 + '/')
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多