No.334


【AWS】httpからhttpsへの強制リダイレクト

リダイレクトループに嵌まるのはお約束

 ELBから各EC2インスタンスへの通信はhttpで行われる。

 そのため、下記のように単純に記載するとリダイレクトループが発生してブラウザに怒られる。もちろんクライアントにも怒られる。

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://sample.com/$1 [R=301,L]

 ELBを経由している場合は環境変数を使ってリダイレクトループを防ぐ方法が一般的のようである。誰が考えたか知らないけど頭が良い。

 ELBを経由したアクセスは環境変数X-Forwarded-Protoで判定できるのを利用する。

RewriteEngine On
# ヘルスチェックファイルへのアクセスは無視する
RewriteCond %{REQUEST_URI} index\.html$ ※環境にあわせて修正
RewriteRule ^(.*) - [L]
# ELBなら環境変数設定
RewriteCond %{HTTP:X-Forwarded-Proto} "=https"
RewriteRule ^(.*) - [E=HTTPS:on]
# httpsもしくはELB配下なら除外
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteCond %{HTTP:CloudFront-Forwarded-Proto} !=https
# httpsにリダイレクト
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R=301,QSA,L]

 ELBのヘルスチェックはリダイレクトを追従してくれないので、ヘルスチェックファイルはhttps化から除外している。

 ヘルスチェックファイルのデフォルトはindex.html。変更時は各環境で使っているファイル名を適宜記述すること。