[Heroku]herokuでhttpでのアクセスをhttpsへリダイレクトさせる設定

htaccessを使用して、httpでのアクセスを全てhttpsへリダイレクトさせる設定を書いた際に、
少し悩んだのでメモ。

通常のリダイレクト

ググるなどして調べるとまず出てくるのがこの方法。
実際、vagrantなんかでのローカル環境だとこれで問題なくリダイレクト出来た。

1
2
3
RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

もしくはこれ。

1
2
3
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

参考サイト
HTTPSを強制する簡単な設定(htaccess)
.htaccessファイルでHTTPアクセスをSSLにリダイレクトする方法とその逆も

しかし、全く同じファイルをherokuにアップするとリダイレクトループが発生し、動かなくなってしまった。

heroku(aws)環境でのリダイレクト

herokuはaws上で動いています。
で、awsなどで使われている負荷分散ための処理、ロードバランサが設定されていると?上記のエラーは起こってしまうようです。

参考ページ
apache(htaccess)でリバースプロキシー経由のHTTP/HTTPS転送
一部のページでのSSLの設定に困っています
AWS Elastic Load Balancer と Apache を使って HTTPS(SSL) 通信を行うための設定方法

これを回避するには、上記参考サイトにもあるように、HTTP:X-Forwarded-Protoを見て転送をかけるかどうかを判断してやることでループしないように出来るみたい。

実際に設定した内容は以下。

1
2
3
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

これで無事、動作しました。

   このエントリーをはてなブックマークに追加