【问题标题】:How to force node.js/express.js to HTTPS when it is running behind an AWS load balancer在 AWS 负载均衡器后面运行时如何强制 node.js/express.js 使用 HTTPS
【发布时间】:2012-02-19 22:33:21
【问题描述】:

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

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

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

【问题讨论】:

  • 您是否将http:// 链接返回给客户端?
  • 我找不到。客户端中的所有路径都是相对的(对于 ajax 调用)。
  • 大多数浏览器都有一些方法可以跟踪从您的代码中进行的所有调用、监视重定向等。我会运行跟踪并查看 http 链接的来源(例如,来自您的代码或来自远端的重定向)。
  • 我认为根本原因是 express 重定向的方式。除非节点服务器是使用 HTTPS 创建的,否则重定向默认为 HTTP。我在任何地方的文档中都找不到,但它肯定是这样的。我需要找到一种方法来重写标题。

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


【解决方案1】:

我也遇到过同样的问题,但情况略有不同。我正在使用 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') 总是正确的!

从这篇博文 (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();
});

希望对您有所帮助!

【讨论】:

  • 这正是我最终要做的。
  • 谢谢!我正在把头发拉出来。
  • 我一直在为几个小型单页应用程序使用这个解决方案,但最近它实际上未能将 http 转发到 https;我们不得不为 AWS 更新一个 nginx 配置文件,并在那里处理转发。在中间件中设置此配置(如上)与在 nginx 或 apache 配置中设置有什么区别?
  • 谢谢凯文!这与我找到的解决方案一样接近,但我仍然遇到一个问题:当我将它添加到我的节点服务器时,我的健康检查失败。我的 ping 目标是 http:3000/(我的节点服务器在端口 3000 中运行)。你有这个问题吗?
  • @ala8727 你知道它为什么失败吗?我不明白中间件怎么可能失败。
猜你喜欢
  • 2017-12-27
  • 2017-01-16
  • 2015-11-13
  • 2015-05-22
  • 2016-08-16
  • 2020-07-03
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
相关资源
最近更新 更多