如何在 AWS 应用程序负载均衡器上将 HTTP 重定向到 HTTPS?

如何在 AWS 应用程序负载均衡器上将 HTTP 重定向到 HTTPS?

我们的网站需要遵守 HIPAA,因此所有内容都需要加密。我不希望客户在输入“http://mysite.com”,所以我需要同时支持 HTTP 和 HTTPS,并将 HTTP 重定向到 HTTPS。我说得对吗?

我在 Web 服务器上正确执行了此操作。因此,如果我直接连接到 Web 服务器,HTTP 会自动重定向到 HTTPS。一切顺利。

但 Web 服务器位于 AWS Application Load Balancer 后面。我不知道如何在 ELB 上将 HTTP 重定向到 HTTPS。因此客户端浏览器仍然可以通过 HTTP 连接到 ELB。

如何在 AWS 应用程序负载均衡器上设置 HTTP => HTTPS?

换句话说,我确信 ELB 和 Web 服务器之间的连接是 HTTPS,但是如何确保客户端浏览器和 ELB 之间的连接是 HTTPS?

答案1

您可以将下面列出的配置添加到您的 .htaccess 文件中。但在此之前,请确保服务器上已启用 mod_rewrite,并且 .htaccess 文件未被拒绝。

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

有关详细说明,请参阅 aws 的官方文档。 https://aws.amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb/

答案2

截至 2018 年 7 月,应用程序负载均衡器支持此功能。

  • 添加/编辑您的HTTP:80听众
  • 将操作设置为Redirect
  • 协议:https
  • 港口:443
  • 将下一个下拉菜单设置为Original host, path, query
  • 将最后一个下拉菜单设置为301 - Permanently moved

AWS 应用程序负载均衡器上的 HTTP 到 HTTPS 侦听器设置图像

答案3

通常发生的情况是,ELB 设置为接收 https(端口 443)并转发到 http(端口 80)上的 EC2 实例(负载均衡器目标)。

后端 Web 服务器将这些请求重定向到负载均衡器上的端口 443,从而导致重定向的无限循环(在负载均衡器和后端 Web 服务器之间)。

常见的错误信息是ERR_TOO_MANY_REDIRECTS

解决方案是在决定重定向时查看 X-Forwarded-Proto,即负载均衡器所看到的协议。

对于 nginx,配置如下:

server {
    listen   80;
    server_name    www.example.org;   
    if ($http_x_forwarded_proto = 'http') {
         return 301 https://$server_name$request_uri;   
    }
}

对于 apache .htaccess 来说,如下所示:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

注意:尽管有人可能认为如果可以在不重新配置 Web 服务器的情况下处理这个问题会很方便,但截至 2018 年春季,仅使用 ELB 无法解决这个问题,即您必须配置 Web 服务器才能使其工作。

答案4

截至今天,侦听器配置还没有提供重定向 HTTP 的选项。

如果您想这样做,您必须编辑您的 nginx 配置。

您需要小心不要阻止 LB 发送 HTTP 健康检查。可以通过将健康检查配置为使用 HTTPS 或在 nginx 配置文件中仔细考虑这一点来避免这种情况。

这是我在 Elastic Beanstalk 环境中编写转发配置时使用的配置: Elastic Beanstalk 配置将 HTTP 重定向到 HTTPS(将其放在 .ebextensions 文件夹内并部署)

如果您使用 EB,则可以使用它,或者您可以读取配置并手动写入它。

相关内容