Avani 向您演示如何
使用负载均衡器和 Apache
将 HTTP 流量重定向到 HTTPS

redirect-http-https-elb-avani

我在 Elastic Load Balancing (ELB) 中的 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 后面的 Amazon Elastic Compute Cloud (Amazon EC2) 实例的 Web 服务器上包含重写规则。

重要提示:Application Load Balancer 可以使用重定向操作将 HTTP 流量重定向到 HTTPS。您可以将 Classic Load Balancer 迁移到 Application Load Balancer,以便使用此功能。

您必须将重写规则配置为使用 X-Forwarded-Proto 标头和仅重定向 HTTP 客户端。如果不这样做,重写规则可能会在 Classic Load Balancer 和它后面的实例之间创建重定向请求的无限循环。此类循环将导致错误 ERR_TOO_MANY_REDIRECTS

查看以下针对 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 Rewrite 部分中。

8.    重启网站。

9.    确认重定向生效。


此页面对您有帮助吗? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS Support 中心

发布时间:2016 年 8 月 12 日

更新时间:2019 年 3 月 19 日