SSL(HTTPS)の使用が前提のもと、フロントエンドでApache(mod_ssl + mod_proxy_balancer)をリバースプロキシ(兼ロードバランサ)として動かして、そのバックエンドでlighttpdやmongrelを使ってRailsアプリを動かす場合のメモ。
何も考えずにRailsアプリに対してHTTPS接続を行い、アプリ内でリダイレクト(redirect_to)を行った場合、RailsアプリはHTTPSで接続されていることを知らないため、HTTPのURLへリダイレクトしてしまいます。
これを解決するためには、フロントエンドのApacheで、HTTPリクエストヘッダにHTTPS接続であることを指定することで、バックエンドのアプリに伝わるようにします。
# ↓のリンク先を参考にさせていただきましたm(_"_)m
これに必要なのは、Apacheでmod_headersが組み込まれている必要があります。
追加で組み込む場合の詳細については、Google先生に聞くと教えてもらえると思いますが、簡単には↓のような感じ。
$ cd ${APACHE2.2_SRC}/modules/metadata/ $ sudo apxs -c -i -a mod_headers.c
※${APACHE2.2_SRC}は、Apache2.2のソース(httpd-2.2.x.tar.gz)を展開したディレクトリ
で、Apacheの設定ファイルで、以下のように「RequestHeader set X_FORWARDED_PROTO 'https'」を追記してやればOKです。
ProxyPass / balancer://rails_app/ ProxyPassReverse / balancer://rails_app/ <Proxy balancer://rails_app/> RequestHeader set X_FORWARDED_PROTO 'https' BalancerMember http://192.168.1.1:3000 </Proxy>
これで、HTTPS使用時にアプリ側でリダイレクトが発生する場合でも、リダイレクト先がHTTPSとなるようになりました!
# Thanks! id:kuranuki & ふくださん