🔁
ALB追加で起きた ERR_TOO_MANY_REDIRECTS の原因と解決法
1. 背景
EC2単体構成にALBを追加することがありました
ALBを作成してリスナールールにて、HTTP→HTTPSのリダイレクトを設定してサイトにアクセスしたところ、ERR_TOO_MANY_REDIRECTSが発生しました
2. 原因
ApacheにすでにHTTP→HTTPSリダイレクトが入っていることに気づいておりませんでした
<VirtualHost *:80>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</IfModule>
</VirtualHost>
これによって以下のようなループが発生していた模様です
ブラウザ (https://example.com)
│
▼
ALB 443 (HTTPS終端)
│ (EC2にはHTTPで転送)
▼
EC2 (Apache)
│ HTTPと判断 → リダイレクト 301
▼
ブラウザ (再び https://example.com)
│
…ループ…
※ALBがHTTPS終端してEC2にHTTPで転送するため、ApacheはHTTPと判断して再リダイレクトしてしまう
3. 対処法
3.1 ApacheのHTTP→HTTPSリダイレクトを削除
ALBでリダイレクトを処理しているので、Apache側のHTTP→HTTPSリダイレクトは不要でした
ApacheのHTTP→HTTPSリダイレクトを削除して対応します
3.2 条件付きリダイレクト(X-Forwarded-Proto使用)
ALBでHTTPS終端している場合、サーバー側にはHTTPで届くため、元のリクエストがHTTPSだったのか判断できません。
この場合、X-Forwarded-Protoヘッダーを見ることで、元のプロトコルを判別できます
- http → 元はHTTP
- https → 元はHTTPS
これを使うと、ALB経由と直アクセスを区別した条件付きリダイレクトが可能です
ただ、あまり使用するケースは多くないと思います
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
</VirtualHost>
参考
AWSナレッジセンター
4. まとめ
後から構成にALBを追加する場合、Apache側で既存のHTTP→HTTPSリダイレクトを見落とすと、リダイレクトループ(ERR_TOO_MANY_REDIRECTS)が発生する可能性があります
基本はApache側のリダイレクトを削除し、ALBでリダイレクトを処理するのが安全です
Discussion