Lightsailにてロードバランサー経由でインスタンスにアクセスするとリダイレクトループが発生します

2021.03.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

困っていた内容

Lightsailにてロードバランサーに証明書を設置し、常時SSL化をする様インスタンス側でリダイレクト設定をしたがリダイレクトループが発生する。

設定内容:
・ロードバランサー経由でWordPressインスタンスにアクセスをするためロードバランサーを作成、証明書を設置。

・インスタンス側で、HTTP -> HTTPSのリダイレクト設定を実施。

  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} !^localhost
  RewriteCond %{HTTP_HOST} !^[0-9]+.[0-9]+.[0-9]+.[0-9]+(:[0-9]+)?$
  RewriteCond %{REQUEST_URI} !^/\.well-known
  RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R,L]

エラー内容:
example.com でリダイレクトが繰り返し行われました。
ERR_TOO_MANY_REDIRECTS

どう対応すれば良いの?

現時点でLigtsailのロードバランサーでは、HTTP -> HTTPSへのリダイレクトを行うことができません。
そのため、インスタンス側で HTTP の通信を HTTPS へリダイレクトする必要があります。

しかし先ほどの例のような HTTP -> HTTPS のリダイレクト設定のみの場合、以下の様なリダイレクトが発生します。

  1. ロードバランサーへHTTPで接続
  2. ロードバランサーがターゲットインスタンスにHTTPでトラフィックをルーティング
  3. インスタンスが302を返してHTTPSにリダイレクト
  4. ロードバランサーがHTTPSで受け取る
  5. ロードバランサーがインスタンスへHTTPでルーティング
  6. インスタンスが302を返してHTTPSにリダイレクト
  7. 4に戻る

上記問題を解決するために、クライアントがロードバランサーへの接続に使用したプロトコルがHTTPの場合のみ HTTPSにリダイレクトする様、X-Forwarded-Protoヘッダーを使用する様に設定をする必要があります。

対処方法:
X-Forwarded-Proto ヘッダを付与する様に設定する。

  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteCond %{HTTP_HOST} !^localhost
  RewriteCond %{HTTP_HOST} !^[0-9]+.[0-9]+.[0-9]+.[0-9]+(:[0-9]+)?$
  RewriteCond %{REQUEST_URI} !^/\\.well-known
  RewriteCond %{HTTP:X-Forwarded-Proto} = http ★追加
  RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R,L]

参照情報

Classic Load Balancer で HTTP トラフィックを HTTPS にリダイレクトするにはどうすればよいですか?
* Lightsailの公式ドキュメントではありませんが、上記参考資料と同様の方法が利用可能です。

X-Forwarded-Proto - HTTP ヘッダーおよび Application Load Balancer

X-Forwarded-Proto - HTTP ヘッダーおよび クラシックロードバランサー