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
。変更時は各環境で使っているファイル名を適宜記述すること。