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

当node.js/express.js在AWS负载平衡器后面运行时,如何将其强制为HTTPS,node.js,amazon-web-services,express,load-balancing,Node.js,Amazon Web Services,Express,Load Balancing,我正在AWS上运行node/express服务,并在其前面部署了一个ELB。当我启动一个启用SSL的ELB实例时,它会在我访问的第一个页面上工作,但之后每次服务器访问都会切换到HTTP ELB上的路由规则终止SSL并转发到节点正在侦听的端口8080 SSL终止解决方案对我来说可以正常工作,但我如何在HTTPS上保持后续服务器调用?我也遇到过同样的问题,但情况略有不同。我使用AWS Elastic Beanstalk部署Node.js/Express应用程序,并能够在其上安装SSL证书 结果是我的

我正在AWS上运行node/express服务,并在其前面部署了一个ELB。当我启动一个启用SSL的ELB实例时,它会在我访问的第一个页面上工作,但之后每次服务器访问都会切换到HTTP

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


SSL终止解决方案对我来说可以正常工作,但我如何在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连接,但如果连接最初使用http完成,则启用重定向到https

因为在AWS负载平衡器后面,所有通信都是通过http完成的,像这样的全局重定向指令(在本例中作为中间件)将创建一个无限重定向循环:

app.use(function(req, res, next) {
    if((!req.secure) && (req.protocol !== 'https')) {
        res.redirect('https://' + req.get('Host') + req.url);
    }
}
-->因为指令(
req.protocol!=“https”
)总是正确的

从这篇博文()可以看出,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();
});

希望这有帮助

是否返回指向客户端的
http://
链接?我找不到链接。客户端中的所有路径都是相对的(对于ajax调用)。大多数浏览器都有一些方法来跟踪代码中的所有调用、监视重定向等。我会运行一个跟踪,看看http链接来自何处(例如,来自代码或远端的重定向).我认为根本原因是express重定向的方式。除非节点服务器是使用HTTPS创建的,否则会将默认重定向到HTTP。我在任何地方的文档中都找不到,但它确实是这样的。我需要想办法重写标题。这正是我最后要做的。谢谢!我一直在为几个小的单页应用程序使用这个解决方案,但最近它实际上无法将http转发到https;我们必须为AWS更新一个nginx配置文件,并在那里处理转发。在中间件(如上所述)中设置此配置与在nginx或apache配置中设置有什么区别?谢谢!这是我已经找到的解决方案,但我仍然有一个问题:当我将其添加到节点服务器时,我的健康检查失败。我的ping目标是http:3000/(我的节点服务器正在端口3000中运行)。你有这个问题吗?@ala8727你知道为什么失败了吗?我不明白中间件怎么可能失败。