我们的网站需要遵守 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
答案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,则可以使用它,或者您可以读取配置并手动写入它。