我在 Classic Load Balancer 上使用 HTTP 和 HTTPS 侦听器。Classic Load Balancer 卸除 SSL 负载,而后端连接在单个 HTTP 端口(端口 80)上进行侦听。当我尝试将流量从 HTTP 重定向到 HTTPS(端口 443)时,我收到了错误“ERR_TOO_MANY_REDIRECTS”。如何在不将后端侦听器更改为端口 443 的情况下解决此错误?
简短描述
Classic Load Balancer 无法在原定设置下将 HTTP 流量重新导向到 HTTPS。相反,请为 Classic Load Balancer 后面的 Web 服务器实例配置重写规则。
您必须将重写规则配置为使用 X-Forwarded-Proto 标头和仅重新导向 HTTP 客户端。否则,重写规则可能会在 Classic Load Balancer 和它后面的实例之间创建重定向请求的无限循环。此类循环将导致错误“ERR_TOO_MANY_REDIRECTS”。
注意:Application Load Balancer 可以使用重定向操作将 HTTP 流量重定向到 HTTPS。将 Classic Load Balancer 迁移到 Application Load Balancer,以便使用此功能。
解决方法
查看以下针对 Apache、NGINX 和 IIS Web 服务器的示例配置。配置位于 Classic Load Balancer 后面的 Web 服务器,让其使用 X-Forwarded-Proto 标头根据客户端使用的是 HTTP 还是 HTTPS 来定向流量。请务必将如下所述的重写规则添加到 Web 服务器中:
- 将使用 HTTP 的客户端重定向到 HTTPS URL
- 直接为使用 HTTPS 的客户端提供服务
重要提示:以下配置仅作为示例提供。根据您的配置和用例修改它们。
Apache 服务器:虚拟主机文件方法(最佳实践)
1. 打开 Apache 配置文件。该文件可能位于以下目录:/etc/httpd/conf/httpd.conf (Apache 2/httpd)、/etc/apache2/sites-enabled/ (Apache 2.4) 或 /etc/apache2/apache2.conf(Ubuntu 上的 Apache)。
2. 将类似以下所示的重写规则添加到配置文件的 VirtualHost 部分中:
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
3. 保存 Apache 配置文件。
4. 重启 Apache。
Apache 服务器:.htaccess 文件方法(不是最佳实践)
警告:最好是使用上一节介绍的 Apache 虚拟主机文件方法。根据 Apache .htaccess 文件准则,请仅在您无法访问 Apache 主配置文件时才使用 .htaccess 文件。
1. 打开 Apache 配置文件。该文件可能位于以下目录:/etc/httpd/conf/httpd.conf (Apache 2/httpd) 或 /etc/apache2/sites-enabled/ (Apache 2.4)。
2. 如下所示编辑 Directory 指令,以便启用 .htaccess:
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
3. 保存 Apache 配置文件。
4. 打开 .htaccess 文件。
5. 添加与以下类似的重写规则:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
6. 保存 .htaccess 文件。
7. 重启 Apache。
NGINX 服务器
注意:此解决方法适用于 NGINX 1.10.3 (Ubuntu) 和 NGINX 1.12.1 (Amazon Linux)。
1. 打开 NGINX 配置文件 (nginx.conf)。
2. 添加以下重写规则。请务必根据您的配置修改重写规则。
server {
listen 80;
server_name _;
if ($http_x_forwarded_proto = 'http'){
return 301 https://$host$request_uri;
}
}
3. 重启 NGINX。
IIS 服务器
注意:此解决方法适用于 Microsoft Windows Server 2012 R2 和 2016 Base。
1. 安装 Microsoft 提供的 IIS URL 重写模块。
2. 打开 web.config 文件。
3. 将以下重写规则添加到 <system.webServer> 部分中。请务必根据您的特定配置修改重写规则。
<rewrite>
<rules>
<rule name="Rewrite HTTP to HTTPS" stopProcessing="true">
<match url="^(.*)$"/>
<conditions logicalGrouping="MatchAny">
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$"/>
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}"/>
</rule>
</rules>
</rewrite>
4. 保存 web.config 文件。
5. 打开 IIS 管理器。
6. 刷新默认网站。
7. 确认新的重写规则显示在 URL 重写部分中。
8. 重启网站。
9. 确认重定向生效。
相关信息
当我连接到在配置为使用 Classic Load Balancing 的 EC2 实例上运行的 Web 服务器时,收到 HTTP 5xx 错误。如何排查这些错误?