如何在 Classic Load Balancer 上将 HTTP 流量重新导向到 HTTPS?

2 分钟阅读
0

我在 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 错误。如何排查这些错误?

相关视频

AWS 官方
AWS 官方已更新 3 年前