代码之家  ›  专栏  ›  技术社区  ›  joshua.paling

在负载均衡器之前访问Heroku上的原始请求

  •  0
  • joshua.paling  · 技术社区  · 6 年前

    当请求在Heroku上访问我们的Express应用程序时,Express中的req对象不再像浏览器发送的原始请求,而是从Heroku的负载均衡器发送到我们的应用程序的请求。

    我需要访问命中负载均衡器的原始请求的属性。我该如何处理Heroku?

    下面是一些我尝试过的例子,所有这些都是错误的——协议应该是 https 域应该是例如。 example.com :

    req.protocol http
    req.headers['X-Forwarded-Proto'] http
    req.hostname :shelted-storm-123.herokuspace.com
    req.headers.host :shelted-storm-123.herokuspace.com
    req.header('host') :shelted-storm-123.herokuspace.com
    req.headers['X-Forwarded-Host'] :未定义

    我要做的是始终使用WWW版本的URL,并重定向例如。 http://example.com/my-page http://www.example.com/my-page

    确切的代码(Express中间件)是:

    export default function redirectWww(req, res, next) {
      var host = req.header('host')
      if (host.match(/^www\..*/i)) {
        next()
      } else {
        res.redirect(301, `${req.protocol}://www.${host}${req.originalUrl}`)
      }
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Elliot Blackburn    6 年前

    看起来您只需要协议和主机名,这些可以通过 req.protocol req.hostname 任何Express HTTP处理程序中的变量(A req, res, next 功能)。

    如果你在找其他的标题,你可能会走运。Heroku是一个封闭的环境,它能让你快速前进,你想要的控制力越强,你就越可能需要转向更自我管理的领域。 Heroku's load balancer / http routing docs show the headers they append 但你所列的那些是他们提供的,而不是他们所要求的。