当前位置: 首页 > 面试题库 >

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

韦衡
2023-03-14
问题内容

我正在AWS上运行节点/快速服务,并已在其前面部署了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')永远是正确的!

从此博客文章(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();
});

希望对您有所帮助!



 类似资料:
  • 我有一个Wordpress网站在AWS EC2实例上运行。这是通过AWS弹性负载平衡器提供的,它使用我从Amazon获得的证书启用了HTTPS。 其目的是为该网站提供http和https版本。加载http版本可以正常工作。 然而,当我加载https版本时,会出现混合内容错误,因为总是返回http链接。负载平衡器的工作方式是TLS终止于LB,并通过端口80与实际EC2实例通信。因此,实例本身上没有H

  • 我在将https添加到我的EC2实例时遇到了一个问题,也许你们可以找到让它工作的答案。 我有一个负载平衡器,它正在将连接转发到我的EC2实例,我已将SSL证书添加到负载平衡器,一切正常,我已将侦听器添加到端口443,该端口将转发到我的实例的端口443,我已将Apache配置为在端口443和80上侦听,现在这里是我的负载平衡器的屏幕截图: SSL证书有效,在端口80(HTTP)上一切正常,但如果我尝

  • 我正在尝试使用ELB部署一些nodejs站点,但ELB和EC2实例的安全组都存在一些问题。 我想做的是允许ELB接受端口80请求,并将这些请求转发到EC2实例上的端口3000,我不希望EC2实例可以从Internet直接访问,它们应该只能通过负载均衡器(在端口3000上)访问。 因此,在我的公有子网的 VPC 中,我有: < li >设置转发80 (HTTP)到3000 (HTTP)的ELB <

  • 目标是在一个简单的堆栈中包含 HTTP/2 支持:在多个 EC2 实例中部署的 Web 应用程序是启用了 PROXY 协议策略 (SSL:443 ➝ TCP:80) 的传输级 CLB,以便卸载 SSL/TLS 并平衡传入的 HTTPS 流量。 PROXY协议的几个原因:(1)地理定位逻辑的执行;(2)执行简单的访问控制规则;(3)日志记录。所有这些功能都需要访问可靠的(即不可轻易伪造的)客户端IP

  • 问题内容: 我正在尝试将所有传入的Traefik从http重定向到https,用于Web应用程序,该应用程序从具有自定义端口的docker容器中获取。 如果我构建了这个docker compose文件,并扩展了应用程序,一切将按预期工作。我可以请求应用程序的http和https,但是我尝试实现仅提供https并将http重定向到https的目的。 由于我使用的是Docker-Compose文件,因

  • 我有一个spring boot应用程序通过入口控制器在GKE上运行,带有Google https负载均衡器。我正在寻找的行为是Spring Boot应用程序在收到http请求时重定向到https。在Spring Boot2.2和更早的版本中,我可以通过下面的代码和配置来实现这一点。 我的应用程序yaml中的配置 问题:在Spring Boot2.3上运行的GKE上,通过和入口控制器配置的GCP负载