Node.js www – 非wwwredirect

有没有机会以某种方式将wwwredirect到node.js中的非www URL? 由于在节点Web服务器中没有htaccess,我很好奇如何做到这一点。

你正在使用快递,对吗? 如果是这样的话,您可以创build一个路由处理程序,让所有GET请求都通过,检查它们是否是“www”URL,并在适当的情况下redirect到适当的非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(); } }) 

即使这个问题已经接近3年了,以前发表的答案(和他们的意见)还有一些微妙的问题,而且在评论中也有一些很好的build议,但是没有把答案本身带回到答案中。 这里有一些重要的事情要注意:

  1. 不要在redirectURI中对http://https://进行硬编码; 当在开发环境和产品环境之间切换时,这会使生活变得很req.protocol改为使用req.protocol
  2. 另请注意,为了在执行SSL终止的代理(例如Elastic Load Balancer) req.protocol可靠地使用req.protocol ,您需要确保已启用trust proxy设置。 这将确保req.protocol返回浏览器看到的协议,而不是最终将其发送到您的应用服务器的协议。
  3. 接受的答案有一个逻辑错误,因为它与/^www/匹配,但使用/^www./格式化redirectURI。 在实践中,这可能不会咬任何人,但它导致像wwwgotcha.example.com这样的无限redirect循环。
  4. 一定要使用req.headers.host而不是req.host ,因为后者会req.host端口号。 因此,如果您要处理www.example.com:3000的请求,则会将用户redirect到www.example.com ,然后减去正确的端口号。
  5. 正如Dário指出的那样 ,当你从www到non-www(反之亦然)进行search引擎优化时 ,你通常会使用301redirect。
  6. 最后一个问题是最不重要的,但是在创buildredirectURI时使用req.originalUrl通常更加安全,以防万一您碰巧在一个已安装的“子应用程序”中运行。

所有这一切说,这是我的build议的方法,考虑到上述考虑:

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

这是一个基本的例子,你可以模仿ajax的redirect指令在nodejs中的行为。

函数redirect采用RegExp或string。

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

在DevOps的世界和越来越多的托pipe平台的采用中,这种types的事情绝不应该由代码来处理。 您应该使用基础结构来处理redirect。 将这些代码放到应用程序中,意味着如果操作团队在apex条目中出现问题,这些问题就不能被缓解。 此外,虽然它是幻想,光泽和髋关节,使用顶点作为您的网站url限制了操作的能力redirect的网站,如果出现问题,并导致问题,当你想要做一个蓝色/绿色,A / Btesting或地理redirect(在某些情况下)。 你的代码和应用程​​序应该是URL不可知的。

我同意上面的塞巴斯蒂安小小的调整,如果你使用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);