我有一个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)我的网址
答案 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 + '/')
}
}