亚马逊弹性负载均衡器没有填充x-forwarded-proto头部。

6
我正在尝试将所有http请求强制转换为https请求,但我遇到了一个问题:弹性负载均衡器没有在请求中填充x-forwarded-proto头信息。这是我使用的代码,由于这个问题导致了重定向循环。请问我该如何解决这个问题?
app.use (function (req, res, next) {
    console.log('Request headers = ' + JSON.stringify(req.headers));
    console.log('Request protocol = ' + JSON.stringify(req.protocol));
    var schema = (req.headers['x-forwarded-proto'] || '').toLowerCase();
    if (schema === 'https') {
       next();
    } else {
       res.redirect('https://' + req.headers.host + req.url);
    }
});
2个回答

14

听起来你的ELB监听器可能配置为TCP而不是HTTP。如果配置为TCP,则不会添加X-Forwarded-Proto或X-Forwarded-For。


1
发送http和https请求到两个不同的端口。如果请求通过http端口进行,您可以安全地将其重定向。

你的意思是在 app.js 中有两个端口和两个 HTTP 服务器?实际上,这一切都是由 EBS 和负载均衡器自动配置的。这就是问题所在。 - user883499
这是我的负载均衡器端口配置: 80(TCP)转发到8080(TCP), 443(SSL,证书:xyzabc)转发到8080(TCP)。 - user883499
跳过端口80的转发,立即重定向。我猜你在使用某种Web服务器来管理Node吧? - datasage
转发是通过EBS(负载均衡器)到运行Express应用的端口(process.env.PORT)的应用实例完成的。 据我所知,我没有办法在EBS或负载均衡器上重定向它。 我没有配置任何位于节点之前的Web服务器,因为这就是EBS的全部意义。 避免所有HAProxy / nginx等的复杂性。 对吧? - user883499
2
@1800INFORMATION 解决方案需要在ELB和Web服务器上实现。在Web服务器上,您需要定义两个虚拟主机,分别监听不同的端口(例如80和81)。端口80上的虚拟主机将所有流量重定向到HTTPS,然后转到端口81上的正常站点。 - datasage
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接