如何在 Classic Load Balancer 上將 HTTP 流量重新定向至 HTTPS?

上次更新日期:2020 年 11 月 5 日

我在 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 伺服器上包含重寫規則。

必須設定重寫規則以使用 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 (Apache on Ubuntu)。

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.    驗證您的重新定向是否運作。