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


相關資訊

連線至在 EC2 執行個體 (設定為使用 Classic Load Balancing) 上執行的 Web 伺服器時收到 HTTP 5xx 錯誤。如何對這些錯誤進行疑難排解?

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