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

redirect-http-https-elb-avani

我现在使用的是 Elastic Load Balancing (ELB),并且我的 Classic Load Balancer 上有 HTTP 和 HTTPS 侦听器。在我向我的 Web 服务器添加重定向逻辑后,我的网站停止工作,并且我收到错误 ERR_TOO_MANY_REDIRECTS。负载均衡器将卸载 SSL,并且后端仅侦听单个 HTTP 端口。我想将通过负载均衡器在端口 80 上传入我的 Web 服务器的所有流量重定向至 HTTPS 端口 443,但我不想将我的后端侦听器更改为端口 443。我如何解决此问题?

如果您使用的是 Classic Load Balancer,则无法在负载均衡器级别将 HTTP 流量重定向至 HTTPS。相反,在负载均衡器后面的 Web 服务器中实施任何重定向逻辑。

以下情况将导致负载均衡器和后端 Web 服务器之间出现无限重定向循环:

  1. 用于将 HTTP 请求重定向至 HTTPS 的 Web 服务器上的重写规则会强制实施请求以对负载均衡器上的 HTTPS 流量使用端口 443。
  2. 负载均衡器仍会将请求发送到端口 80 上的后端 Web 服务器。
  3. 后端 Web 服务器将请求重定向至负载均衡器上的端口 443。

将返回错误 ERR_TOO_MANY_REDIRECTS,并且绝不支持请求。

要解决此问题,请使用 HTTP 请求的 X-Forwarded-Proto 标头将您的 Web 服务器的重写规则更改为仅在客户端协议为 HTTP 时应用。忽略客户端使用的所有其他协议的重写规则。

注意:如果您使用的是 Application Load Balancer,请改用重定向操作来重定向流量。

以下 Apache、NGINX 和 IIS Web 服务器示例执行以下操作:

  • 当客户端使用 HTTP 访问您的网站时,它们将重定向至 HTTPS URL。
  • 当客户端使用 HTTPS 访问您的网站时,Web 服务器将直接为其提供服务。

Apache 服务器:虚拟主机文件方法(推荐)

在配置文件的虚拟主机部分中包含重写规则。例如,对于 Apache httpd server,编辑 /etc/httpd/conf/httpd.conf 文件;对于 Apache 2.4,编辑 /etc/apache2/sites-enabled/ 文件夹中的 .conf 文件。

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

Apache 服务器:.htaccess 文件方法(不推荐)

警告:建议不要使用 .htaccess,应仅在您无权访问主配置文件时使用它。请参阅 Apache HTTP Server 教程:.htaccess 文件

1.通过目录指令启用 Apache 配置文件中的 .htaccess 。例如,对于 Apache httpd server,请编辑 /etc/httpd/conf/httpd.conf 文件。对于 Apache 2.4,编辑 /etc/apache2/sites-enabled/ 文件夹中的 conf 文件。请参阅 Apache HTTP Server 教程:.htaccess 文件

<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

2.将以下重写规则添加到您的 .htaccess 文件:

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

NGINX 服务器

注意:适用于 nginx/1.10.3 (Ubuntu) 和 nginx/1.12.1 (Amazon Linux)。

修改以下示例重写规则 (nginx.conf):

server {
    listen 80;
    server_name _;
    if ($http_x_forwarded_proto = 'http'){
    return 301 https://$host$request_uri;
    }
}

IIS 服务器

注意: 仅适用于 Microsoft Windows Server 2012 R2 和 2016 Base。

1.安装 Microsoft IIS 下载中的 URL 重写模块

2.在 web.config<system.webServer> 部分下修改 IIS 后端的以下示例重写规则:

<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}{REQUEST_URI}"/>
        </rule>
    </rules>
</rewrite>

3.打开 IIS Manager,然后刷新默认网站。规则应显示在 URL Rewrite (URL 重写) 部分中。

4.重启网站并确认重定向起作用。


此页内容对您是否有帮助? |

返回 AWS Support 知识中心

需要帮助? 请访问 AWS 支持中心

发布时间:2016 年 8 月 12 日

更新时间:2018 年 8 月 31 日