Node.js www-非www重定向
是否有机会在node.js中将www重定向到非www URL?由于node web server中没有htaccess,我很好奇如何做到这一点。您使用的是express,对吗?如果是这样,您可以创建一个路由处理程序,让所有GET请求都通过,检查它们是否指向“www”URL,并在适当的情况下重定向到相应的非www URLNode.js www-非www重定向,node.js,express,Node.js,Express,是否有机会在node.js中将www重定向到非www URL?由于node web server中没有htaccess,我很好奇如何做到这一点。您使用的是express,对吗?如果是这样,您可以创建一个路由处理程序,让所有GET请求都通过,检查它们是否指向“www”URL,并在适当的情况下重定向到相应的非www URL app.get('/*', function(req, res, next) { if (req.headers.host.match(/^www/) !== null )
app.get('/*', function(req, res, next) {
if (req.headers.host.match(/^www/) !== null ) {
res.redirect('http://' + req.headers.host.replace(/^www\./, '') + req.url);
} else {
next();
}
})
这是如何在nodejs中模拟apache重定向指令行为的一个基本示例 函数重定向采用RegExp或字符串
var http, redirect;
http = require("http");
redirect = function(host, res, pattern, redirect){
if (host == pattern || (pattern instanceof RegExp && host.match(pattern))) {
console.log("Redirected " + host);
res.writeHead(302, {
'location': redirect
});
res.end();
}};
http.createServer(function(req, res){
redirect(req.headers.host, res, /^www/, 'http://plouf.url');
redirect(req.headers.host, res, 'www.plouf.url', 'http://plouf.url');
res.writeHead(200, {
'Content-Type': 'text/plain'
});
res.end('Hello World\n');
}).listen(8000, '127.0.0.1');
我同意上面的塞巴斯蒂安的观点,只是做了一点小小的调整,如果你使用的是Express。我只想让它成为一个中间件,它将处理所有请求
function removeWWW(req, res, next){
if (req.headers.host.match(/^www/) !== null ) {
res.redirect('http://' + req.headers.host.replace(/^www\./, '') + req.url);
} else {
next();
}
}
app.use(removeWWW);
尽管这个问题已经问了将近3年了,但是在之前发布的答案(以及他们的评论)中仍然存在一些微妙的问题,并且在评论中也有一些好的建议,这些建议并没有回到答案中。以下是需要注意的几个重要事项:
http://
或https://
;在开发环境和产品环境之间切换时,这会让生活变得很糟糕-改用req.protocol
req.protocol
,您需要确保启用了信任代理
设置。这将确保req.protocol
返回浏览器看到的协议,而不是最终发送到应用服务器的协议/^www/
上匹配,但使用/^www./
格式化重定向URI。实际上,这可能不会影响任何人,但它会导致类似wwgotcha.example.com
的无限重定向循环req.headers.host
而不是req.host
,因为后者会去掉端口号。因此,如果要处理www.example.com:3000
的请求,您需要将用户重定向到www.example.com
,减去正确的端口号req.originalUrl
通常更安全,以防您碰巧在已安装的“子应用”中运行function wwwRedirect(req, res, next) {
if (req.headers.host.slice(0, 4) === 'www.') {
var newHost = req.headers.host.slice(4);
return res.redirect(301, req.protocol + '://' + newHost + req.originalUrl);
}
next();
};
app.set('trust proxy', true);
app.use(wwwRedirect);
在DevOps的世界中,托管平台的使用越来越多,这种事情永远不应该由代码来处理。您应该使用基础结构来处理重定向。将此代码放入应用程序意味着如果apex条目中出现故障,操作团队无法缓解问题。此外,虽然apex很别致、很有光泽、很时髦,但当您想进行蓝/绿、a/B测试或地理重定向(在某些情况下)时,使用apex作为站点url会限制操作重定向站点的能力,从而导致出现问题。您的代码和应用程序应该与url无关。的更新版本的答案: 使用express
此外,您应该检查此项。您可以将
get
替换为all
;)然后检查req.headers
是否存在另外,请确保将301设置为重定向的第一个参数(默认情况下,快速重定向为302)。您可以只使用req.host:我还建议使用req.protocol+'://'而不是硬编码http://Ok,最后一条评论-我试着在一个新的答案中总结各种陷阱(很抱歉评论垃圾!):谢谢你的深入回答。我的问题是,node是做这种重定向的地方吗?我知道nginx或Apache通常应该处理这些事情,但我不能动摇node真的不应该这样做的感觉。有没有办法在DNS级别上设置此选项?@JamesSpence问得好。您不会(无法)在DNS级别执行HTTP和/或www重定向,但nginx肯定是适合此项工作的工具。Nginx也是一个很有价值的工具,可以说,在各种各样的攻击缓解措施中,Nginx也是一个很有价值的工具,所以坦率地说,没有Nginx我是不会离开家的。也就是说,在node land中这样做也没有什么根本的错误,特别是如果您不想在混合中引入一个新的反向代理,否则将毫无用处。您的答案非常有用,应该是公认的答案。开箱即用!
server.use((req, res, next) => {
if (req.headers.host.startsWith('www.')) {
const newHost = req.headers.host.slice(4)
return res.redirect(
301,
`${req.protocol}://${newHost}${req.originalUrl}`,
)
}
next()
})