Ruby on Rails1.2.3 + mongrel + Apache2.2.4 + mod_proxy + SSL でリダイレクトがうまくいかない

RailsSSLを扱うとき、railsアプリ内でredirectしているところ(エラーページへの遷移など)ではなぜかhttpsでなくhttpのほうへ飛ばされてしまうという罠が良く知られていて、回避策としてapachehttpd.confなどで


RequestHeader set X_FORWARDED_PROTO 'https'
のような記述を追加してやればよいと色々なサイトさんで紹介されています。
今回、申込フォームへ遷移する際にはhttpsのほうへリダイレクトしたいという極々ありがちな要件がありまして、confファイルで以下のようにVirtualHostを設定してみました。


ServerAdmin admin@example.com
DocumentRoot /home/hoge/rails-app/my-site/public
ServerName example.com:80

Redirect /apply https://example.com/apply

ErrorLog logs/error_log
CustomLog logs/access_log combined

ProxyRequests 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:443

ErrorLog logs/secure_error_log
CustomLog logs/secure_access_log combined

SSLEngine on
SSLCertificateKeyFile conf/ssl.key/site.key
SSLCertificateFile conf/ssl.crt/newcert.crt

ProxyRequests Off


Order deny,allow
Allow from all

ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
RequestHeader set X_FORWARDED_PROTO 'https'

/applyのときだけhttpsの方へリダイレクトしてほしかったのですが、これがうまく動いてくれません。数時間ほど迷走してしまったのですが、ふとrails側のログを見るとこのような出力がありました。

302 Found [http://example.com/apply]
ということは、Apache側でリダイレクト指定があっても、リクエストはrailsのほうへ優先して飛んでいたようです。RedirectよりProxyPassの指定のほうが強いようですね。そこで/applyのときにはrails側へとばないよう、バーチャルホスト80番の設定に以下の記述を追加してやります。

ProxyPass /apply !
これをProxyPassの行の直前に入れてやることで、無事リダイレクトしてくれるようになりました。