如何在 Classic Load Balancer 上將 HTTP 流量重新定向至 HTTPS?
上次更新日期:2022 年 1 月 7 日
我在 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. 驗證您的重新定向是否運作。