Ruby on Rails1.2.3 + mongrel + Apache2.2.4 + mod_proxy + SSL でリダイレクトがうまくいかない
RailsでSSLを扱うとき、railsアプリ内でredirectしているところ(エラーページへの遷移など)ではなぜかhttpsでなくhttpのほうへ飛ばされてしまうという罠が良く知られていて、回避策としてapacheのhttpd.confなどで
のような記述を追加してやればよいと色々なサイトさんで紹介されています。
RequestHeader set X_FORWARDED_PROTO 'https'
今回、申込フォームへ遷移する際にはhttpsのほうへリダイレクトしたいという極々ありがちな要件がありまして、confファイルで以下のようにVirtualHostを設定してみました。
/applyのときだけhttpsの方へリダイレクトしてほしかったのですが、これがうまく動いてくれません。数時間ほど迷走してしまったのですが、ふとrails側のログを見るとこのような出力がありました。
ServerAdmin admin@example.com
DocumentRoot /home/hoge/rails-app/my-site/public
ServerName example.com:80Redirect /apply https://example.com/apply
ErrorLog logs/error_log
CustomLog logs/access_log combinedProxyRequests Off
Order deny,allow
Allow from all
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
ServerAdmin admin@example.com
DocumentRoot /home/hoge/rails-app/my-site/public
ServerName example.com:443ErrorLog logs/secure_error_log
CustomLog logs/secure_access_log combinedSSLEngine on
SSLCertificateKeyFile conf/ssl.key/site.key
SSLCertificateFile conf/ssl.crt/newcert.crtProxyRequests Off
Order deny,allow
Allow from all
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
RequestHeader set X_FORWARDED_PROTO 'https'
ということは、Apache側でリダイレクト指定があっても、リクエストはrailsのほうへ優先して飛んでいたようです。RedirectよりProxyPassの指定のほうが強いようですね。そこで/applyのときにはrails側へとばないよう、バーチャルホスト80番の設定に以下の記述を追加してやります。
302 Found [http://example.com/apply]
これをProxyPassの行の直前に入れてやることで、無事リダイレクトしてくれるようになりました。
ProxyPass /apply !