当请求到达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-page
至http://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}`)
}
}
答案 0 :(得分:1)
看起来您只需要协议和主机名,可以在任何快速http处理程序(req, res, next
函数)中找到req.protocol
和req.hostname
变量。
如果您正在寻找其他标题,那么您可能会失败。 Heroku是一个被锁定的环境,可以让你快速前进,你想要的控制越多,你可能需要越多地转向更自我管理的东西。 Heroku's load balancer / http routing docs show the headers they append但您根据要求列出的不是他们提供的那些。