我将ELB配置为打开80和443,其中443配置了SSL。两个ELB端口都指向实例的80端口。 ELB的heatlh检查使用ping目标HTTP:80 / index.html。它曾经工作,直到我最近决定开始将http重定向到https。
现在server.js上有以下代码(//中的代码是我新添加的代码):
//
app.use(function(req, res, next) {
if (config.env === 'prod' && req.get('X-Forwarded-Proto') !== 'https') {
console.log("redirecting")
console.log('https://' + req.get('Host') + req.url)
res.set('X-Forwarded-Proto', 'https');
res.redirect('https://' + req.get('Host') + req.url);
}
else
next();
});
//
app.use(express.static(path.join(__dirname, 'home')));
app.set('trust proxy'); // enable this to trust the proxy
app.listen(app.get('port'), function() {
console.log('Express server listening on port ' + app.get('port'));
});
app.get("/*", function(req, res, next) {
res.sendFile(path.join(__dirname, 'home/index.html'));
});
我认为上述请求会将所有请求重定向到elb服务器,但使用https协议。
然而,服务器开始打印:
redirecting
https://10.x.x.xx/index.html
然后ELB失败,因为https://10.x.x.xx/inde.html不可用。
然而index.html位于{domain} /。
之下我认为我重定向的方式可能是错误的 - 但我不知道如何修复它。
答案 0 :(得分:1)
我的解决方案是在重定向之前检查健康API路由。
if (config.env === 'prod' && req.get('X-Forwarded-Proto') !== 'https' && req.url !== '/api/health') {
// redirect
}
答案 1 :(得分:0)
负载均衡器运行状况检查请求不会有x-forwarded-proto
标头,因为它们尚未从客户端转发,而是直接来自负载均衡器。在进行重定向之前,您可能需要先检查标头是否存在。
此外,我对您的SSL设置感到有点困惑。您是在Load Balancer上进行SSL终止,还是在EC2服务器上提供SSL证书?您说“两个ELB端口都指向实例'80端口”,这意味着您没有在EC2服务器上提供SSL证书,因此您的运行状况检查URL应为http
而不是https
。
此外,您在重定向之前拥有的这一行完全没有任何结果:
res.set('X-Forwarded-Proto', 'https');