繁体   English   中英

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

[英]Node.js redirect with/without trailing slash

我有一个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斜线路由到斜线。 另一个问题的答案解决了另一种方式。 我不能.substr(-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
});

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

希望它对你有用。

在“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();
    }
});

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

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

express.Router({strict: true});

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

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

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

您可以尝试jncraton的答案 ,但只是在目录中添加斜杠..

const path = require('path')

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM