当在AWS负载均衡器后面运行时,如何将node.js / express.js强制转换为HTTPS

我正在AWS上运行一个节点/快速服务,并在它之前部署了一个ELB。 当启用启用SSL的ELB实例时,它会在我点击的第一个页面上工作,然后在每个服务器访问之后切换到HTTP。

ELB上的路由规则终止SSL并转发到节点正在监听的端口8080。

SSLterminal解决scheme对于我的目的来说工作正常,但是如何保持HTTPS上的后续服务器调用?

我遇到了同样的问题,但情况略有不同。 我使用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 

所以问题是只批准我的node.js应用程序的HTTPS连接,但启用redirect到HTTPS,如果连接完成初始化使用HTTP。

因为在AWS负载均衡器的后面,所有通信都是通过http完成的,所以全局redirect指令(在这种情况下作为中间件)就像这样会创build一个无限redirect循环:

 app.use(function(req, res, next) { if((!req.secure) && (req.protocol !== 'https')) { res.redirect('https://' + req.get('Host') + req.url); } } 

– >只是因为指令( req.protocol !== 'https' )永远是真的!

从这个博客文章( http://matthew.mceachen.us/blog/howto-force-https-with-amazon-elastic-load-balancer-and-apache-1071.html ),事实certificate,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(); }); 

希望这个帮助!