🔁

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