Gre*_*reg 24 load-balancing amazon-web-services node.js express
我正在AWS上运行节点/快速服务,并在其前面部署了一个ELB.当我启用启用了SSL的ELB实例时,它适用于我点击的第一个页面,但之后会为每个服务器访问切换到HTTP.
ELB上的路由规则终止SSL并转发到节点正在侦听的端口8080.
SSL终止解决方案适用于我的目的,但如何在HTTPS上保留后续服务器调用?
Kev*_*in. 56
我遇到了同样的问题,但情况略有不同.我正在使用AWS Elastic Beanstalk部署Node.js/Express应用程序,并且能够在其上安装SSL证书.
结果是我的应用程序可以在http和https协议上访问.负载均衡器的路由表如下所示:
(Load balancer) http 80 --> (Node instance) http 8080
(Load balancer) https 443 --> (Node instance) http 8080
Run Code Online (Sandbox Code Playgroud)
所以问题是在我的node.js应用程序上仅授权https连接,但如果连接是使用http初始化完成,则启用重定向到https.
因为在AWS负载均衡器后面,所有的通信都是通过http完成的,全局重定向指令(在这种情况下作为中间件)就像这样会创建一个无限重定向循环:
app.use(function(req, res, next) {
if((!req.secure) && (req.protocol !== 'https')) {
res.redirect('https://' + req.get('Host') + req.url);
}
}
Run Code Online (Sandbox Code Playgroud)
- >简单地说,指令(req.protocol !== 'https')永远是真的!
从这篇博文(http://matthew.mceachen.us/blog/howto-force-https-with-amazon-elastic-load-balancer-and-apache-1071.html)中可以看出,AWS ELB添加了您可以捕获的X-Forwarded-Proto标头,以了解在负载均衡器(http或https)之前使用的协议是什么.
所以这个小修改就行了:
app.use(function(req, res, next) {
if((!req.secure) && (req.get('X-Forwarded-Proto') !== 'https')) {
res.redirect('https://' + req.get('Host') + req.url);
}
else
next();
});
Run Code Online (Sandbox Code Playgroud)
希望这有帮助!
| 归档时间: |
|
| 查看次数: |
8487 次 |
| 最近记录: |