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 の後ろにあるウェブサーバーインスタンスでリライトルールを設定する必要があります。
ウェブアプリケーションサーバー上のリライトルールを設定し、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 ウェブサーバーで次の設定例をレビューします。クライアントが HTTP、HTTPS のどちらを使用するかに応じて、Classic Load Balancer の背後にあるウェブサーバーが X-Forwarded-Proto ヘッダーを使用してトラフィックをリダイレクトするように設定します。次のようなリライトルールをウェブサーバーに追加する必要があります。
- HTTP を使用してクライアントを HTTPS URL にリダイレクトする
- HTTPS を使用してクライアントに直接サービスを行う
注: 構成とユースケースに応じて、次の構成例を変更してください。
Apache サーバー: 仮想ホストファイル方式
次の方法でウェブサーバーを設定することをおすすめします。
-
Apache 設定ファイルを開きます。配置場所の例としては、/etc/httpd/conf/httpd.conf (Apache 2/httpd)、/etc/apache2/sites-enabled/ (Apache 2.4)、/etc/apache2/apache2.conf (Apache on Ubuntu) などがあります。
-
構成ファイルの VirtualHost セクションに、次のようなリライトルールを追加します。
<VirtualHost *:80>RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
-
Apache 設定ファイルを保存します。
-
Apache を再起動します。
Apache サーバー: .htaccess ファイル方式
メインの Apache 設定ファイルにアクセスできない場合は、.htaccess ファイルを使用してください。詳細については、Apache のウェブサイト「Apache HTTP サーバーのチュートリアル: .htaccess ファイル」ページの「.htaccess ファイルを使用する場合と使用しない場合」を参照してください。
ウェブサーバーを設定するには、次の手順を実行します。
-
Apache 設定ファイルを開きます。配置場所の例としては、/etc/httpd/conf/httpd.conf (Apache 2/httpd)、/etc/apache2/sites-enabled/ (Apache 2.4) などがあります。
-
Directory ディレクティブを編集し、.htaccess を有効にします。
<Directory "/var/www/html"> Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
-
Apache 設定ファイルを保存します。
-
**.htaccess ** ファイルを開きます。
-
次のようなリライトルールを追加します。
RewriteEngine OnRewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
-
.htaccess ファイルを保存します。
-
Apache を再起動します。
NGINX サーバー
注: この解決策は、NGINX 1.10.3 (Ubuntu) および NGINX 1.12.1 (Amazon Linux) に適用されます。
次の手順を実行します。
-
NGINX 設定ファイル (nginx.conf) を開きます。
-
次のリライトルールを追加します。設定に応じてリライトルールを変更してください。
server { listen 80;
server_name _;
if ($http_x_forwarded_proto = 'http'){
return 301 https://$host$request_uri;
}
}
-
NGINX を再起動します。
IIS サーバー
注: この解決策は、Microsoft Windows Server 2012 R2 および 2016 ベースに適用されます。
次の手順を実行します。
-
IIS URL rewrite モジュールをインストールします。詳細については、Microsoft のウェブサイトで「URL rewrite」を参照してください。
-
web.config ファイルを開きます。
-
次のリライトルールを <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>
-
web.config ファイルを保存します。
-
IIS Manager を開きます。
-
デフォルトのウェブサイトを更新します。
-
新しいリライトルールが [URL Rewrite] セクションに表示されていることを確認します。
-
ウェブサイトを再起動します。
-
リダイレクトが機能することを確認します。
関連情報
EC2 インスタンスで実行中の、Classic Load Balancing を使用するように設定されたウェブサーバーに接続すると、HTTP 5xx エラーが発生する理由を知りたいです