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

时间:2018-05-23 14:03:33

标签: express heroku

当请求到达Heroku上的Express应用程序时,来自express的req对象不再类似于浏览器发送的原始请求,而是从Heroku的负载均衡器发送到我们应用程序的请求。

我需要访问遇到负载均衡器的原始请求的属性。我如何使用Heroku做到这一点?

以下是我尝试过的一些示例,所有这些都是错误的 - 协议应该是https而域应该是例如。 example.com

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

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

确切代码(快速中间件)是:

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 个答案:

答案 0 :(得分:1)

看起来您只需要协议和主机名,可以在任何快速http处理程序(req, res, next函数)中找到req.protocolreq.hostname变量。

如果您正在寻找其他标题,那么您可能会失败。 Heroku是一个被锁定的环境,可以让你快速前进,你想要的控制越多,你可能需要越多地转向更自我管理的东西。 Heroku's load balancer / http routing docs show the headers they append但您根据要求列出的不是他们提供的那些。