私は 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 の背後にあるウェブサーバーインスタンスの書き換えルールを設定します。
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 のどちらを使用するかに基づいて、トラフィックを転送するために X-Forwarded-Proto ヘッダーを使用するように、Classic Load Balancer の背後にあるウェブサーバーを設定します。次のような書き換えルールをウェブサーバーに追加します。
- 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 ファイルのガイドラインによると、.htaccess ファイルを使用するのは、メインの Apache 設定ファイルにアクセスできない場合だけです。
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 Manager を開きます。
6. デフォルトのウェブサイトを更新します。
7. 新しい書き換えルールが URL 書き換えセクションに表示されていることを確認します。
8. ウェブサイトを再起動します。
9. リダイレクションが機能していることを確認します。
関連情報
Classic Load Balancing を使用するように設定された EC2 インスタンスで実行されているウェブサーバーに接続すると、HTTP 5xx エラーが発生します。これらのエラーをトラブルシューティングするにはどうすればよいですか?