Node.js www-非www重定向

Node.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 )

是否有机会在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 ) {
    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年了,但是在之前发布的答案(以及他们的评论)中仍然存在一些微妙的问题,并且在评论中也有一些好的建议,这些建议并没有回到答案中。以下是需要注意的几个重要事项:

  • 不要硬编码重定向URI中的
    http://
    https://
    ;在开发环境和产品环境之间切换时,这会让生活变得很糟糕-改用
    req.protocol
  • 还要注意,为了在执行SSL终止的代理(如弹性负载平衡器)后面可靠地使用
    req.protocol
    ,您需要确保启用了
    信任代理
    设置。这将确保
    req.protocol
    返回浏览器看到的协议,而不是最终发送到应用服务器的协议
  • 接受的答案有一个逻辑错误,因为它在
    /^www/
    上匹配,但使用
    /^www./
    格式化重定向URI。实际上,这可能不会影响任何人,但它会导致类似
    wwgotcha.example.com
    的无限重定向循环
  • 确保使用
    req.headers.host
    而不是
    req.host
    ,因为后者会去掉端口号。因此,如果要处理
    www.example.com:3000
    的请求,您需要将用户重定向到
    www.example.com
    ,减去正确的端口号
  • 例如,为了SEO目的,从www转到非www(反之亦然)时,通常需要使用301重定向
  • 最后一个问题是最次要的,但在创建重定向URI时使用
    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()
    })