.htaccess
# force https
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteCond %{HTTP:CloudFront-Forwarded-Proto} !=https
RewriteCond %{HTTP_HOST} !=unsecure.example.com
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R=301,L]
- mod_ssl 判定は
%{HTTPS}
で行う。 - ELBなど一般的なリバースプロキシで https してるときは
X-Forwarded-Proto
ヘッダを見る。 - CloudFrontの場合は
CloudFront-Forwarded-Proto
ヘッダを通す設定をしたうえでそれを見る。 - https リダイレクトしたくないホスト名がある場合は Host ヘッダを見て除外。
- RewriteRule はパスマッチの頭に
^/?
を付けておくとhttpd.conf
直書きでも.htaccess
でも使えるようになるのでコピペが捗る。
あと、個人的にはあまり使わないが Host ヘッダを通さずに X-Forwarded-for の方を採用したい場合は Host ヘッダの代わりにそっち使うようにスべし。その場合 X-Forwarded-Forは複数経由して増える場合があるのでその考慮を忘れないこと。(コピペメモは省略、後で追記するかも)
RewriteCond が多い時のTips
RewriteCond
の第1引数って只の文字列なうえに複数変数とか列挙出来るので例えば上記のケースは以下のようにまとめることが出来る。
RewriteCond %{HTTPS},%{HTTP:X-Forwarded-Proto},%{HTTP:CloudFront-Forwarded-Proto} !(on|https)
RewriteCond %{HTTP_HOST} !=unsecure.example.com
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R=301,L]
個人的に縦に長い条件って読みにくいので結構捗る。