node.js - 在 AWS 负载均衡器后面运行时如何强制 node.js/express.js 使用 HTTPS

标签 node.js amazon-web-services express load-balancing

我在 AWS 上运行 Node/快速服务,并在其前面部署了 ELB。当我启动一个启用了 SSL 的 ELB 实例时,它适用于我点击的第一个页面,但之后切换到 HTTP 以访问每个服务器。

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

SSL 终止解决方案可以很好地满足我的目的,但我如何才能在 HTTPS 上保持后续服务器调用?

最佳答案

我遇到过同样的问题,但情况略有不同。我正在使用 AWS Elastic Beanstalk 部署 Node.js/Express 应用程序,并且能够在其上安装 SSL 证书。

这样做的结果是我的应用程序可以在 http 和 https 协议(protocol)上访问。负载均衡器的路由表如下所示:

(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') 总是正确的!

从这篇博文 (http://matthew.mceachen.us/blog/howto-force-https-with-amazon-elastic-load-balancer-and-apache-1071.html) 可以看出,AWS ELB 添加了一个 X-Forwarded-Proto header ,您可以捕获该 header 以了解负载均衡器之前使用的协议(protocol)(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();
});

希望对您有所帮助!

关于node.js - 在 AWS 负载均衡器后面运行时如何强制 node.js/express.js 使用 HTTPS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9024783/

相关文章:

node.js - 我应该在哪里安装/保存node_modules?

arrays - Node js,for循环奇怪的情况

javascript - 如何在 PuppeteerJS 中迭代所有 <li> 以从 <ul> 句柄获取文本内容?

javascript - 如何在Firestore中正确使用arrayUnion?

java - 在 Spring AWS Cloud Framework 中设置 SNS WaitTime

amazon-web-services - 在 aws-cli/1.10.56 上找不到 aws cloudformation 包命令

amazon-web-services - API 网关 HTTP API CORS

javascript - node.js 和 express 中的异常处理

javascript - Res.cookie 与 document.cookie,它们在安全性方面有什么优势吗?

node.js - 如何以 json 形式返回 listObjectsV2