跳至內容

如何在我的 ELB Classic Load Balancer 上將 HTTP 流量重新導向到 HTTPS?

2 分的閱讀內容
0

我在 Elastic Load Balancing (ELB) Classic Load Balancer 上使用 HTTP 和 HTTPS 接聽程式。我的 Classic Load Balancer 卸載了 SSL,並且後端連線在單一 HTTP 連接埠 (連接埠 80) 上接聽。當我嘗試將流量從 HTTP 重新導向到 HTTPS (連接埠 443) 時,收到錯誤 "ERR_TOO_MANY_REDIRECTS"。

簡短描述

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 後方的網路伺服器,以使用 X-Forwarded-Proto 標頭,根據用戶端使用 HTTP 還是 HTTPS 來引導流量。請務必在您的 Web 伺服器中新增重寫規則:

  • 使用 HTTP 將用戶端重新導向到 HTTPS 網址
  • 使用 HTTPS 直接為用戶端提供服務

**注意:**根據您的組態和使用案例修改以下範例組態。

Apache 伺服器: 虛擬主機檔案方法

最佳做法是使用以下方法來設定您的 Web 伺服器:

  1. 開啟您的 Apache 組態檔案。可能的位置包括 /etc/httpd/conf/httpd.conf (Apache 2/httpd)、/etc/apache2/sites-enabled/ (Apache 2.4) 或 /etc/apache2/apache2.conf (Ubuntu 上的 Ubachetu)。

  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 組態檔案,請使用 .htaccess 檔案。如需詳細資訊,請參閱 Apache 網站「Apache HTTP 伺服器教學課程:.htaccess 檔案」頁面上的何時 (不) 使用 .htaccess 檔案一節。

若要設定您的 Web 伺服器,請完成下列步驟:

  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 OnRewriteCond %{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. 安裝 IIS URL 重寫模組。如需詳細資訊,請參閱 Microsoft 網站上的網址重寫

  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 Manager。

  6. 重新整理預設網站。

  7. 檢查新的重寫規則是否出現在網址重寫區段。

  8. 重新啟動您的網站。

  9. 確認重新導向是否有效。

相關資訊

當我連線到設定為使用 Classic Load Balancing 的 EC2 執行個體上執行的 Web 伺服器時,為什麼會收到 HTTP 5xx 錯誤?

AWS 官方已更新 1 年前