有没有机会以某种方式将www重定向到node.js中的非www URL?由于节点Web服务器中没有htaccess,我很好奇如何做到这一点.
jma*_*777 80
虽然这个问题已经有将近3年的历史了,但是之前发布的答案(以及他们的评论)还有一些微妙的问题,以及评论中的一些好的建议,这些建议并没有回到答案本身.以下是一些需要注意的重要事项:
http://或https://在重定向URI; 这使得在dev和prod环境之间切换时生活很糟糕 - req.protocol而是使用.req.protocol执行SSL终止的代理(例如Elastic Load Balancer)后面可靠地使用,您需要确保trust proxy已启用该设置.这将确保req.protocol返回浏览器看到的协议,而不是最终将其发送到您的应用服务器的协议./^www/,但格式化重定向URI /^www./.在实践中,可能不会咬任何人,但它会导致无限重定向循环等wwwgotcha.example.com.req.headers.host而不是req.host,因为后者剥去端口号.因此,如果您要处理请求www.example.com:3000,则将用户重定向到www.example.com减去正确的端口号.req.originalUrl在创建重定向URI时通常更安全,以防万一你恰好在已安装的"子应用程序"中运行.所有这一切,这是我推荐的方法,考虑到上述因素:
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);
Run Code Online (Sandbox Code Playgroud)
S M*_*S M 28
你正在使用快递,对吧?如果是这样,您可以创建一个所有GET请求都经过的路由处理程序,检查它们是否为"www"URL,并在适当时重定向到相应的非www URL.
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();
}
})
Run Code Online (Sandbox Code Playgroud)
小智 8
jmar777的答案的更新版本:
使用快递
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()
})
Run Code Online (Sandbox Code Playgroud)