リバースプロキシでの環境変数REMOTE_USER渡し
意外な落とし穴が。
リバースプロキシしたRailsアプリの一つでは、手抜きでBasic認証の環境変数REMOTE_USERを利用しているのですが、Mongrelでは認証出来なさそうだったので、Apacheに認証させるようにしました。
すると、当然のごとくRailsにはCGI環境変数のREMOTE_USERが渡らなくなってしまうという…
で、いろいろ情報をあつめてみたら、Apache, REMOTE_USER, and Mongrel - Ruby Forumというのを発見しました。
結局、ちょっと手直ししてこんな感じに。
RewriteEngine On RewriteCond %{LA-U:REMOTE_USER} (.+) RewriteRule . - [E=RU:%1] RequestHeader set X-Forwarded-User %{RU}e
やっていることは以下かと思います。
- RewriteCondで環境変数REMOTE_USERを正規表現でグルーピング。これは%1で後方参照できる。LA-Uをつけているのは認証が行われた後のREMOTE_USERを取得するため。
- RewriteRuleで環境変数RU(名前は多分適当)に%1(前述の環境変数REMOTE_USER)を設定。
- RequestHeaderでHTTPリクエストヘッダーとしてX-Forwarded-Userに環境変数RUを設定。
- RequestHeaderではもともとaddだったのだけどブラウザによっては複数回実行されるようなのでsetに変更。
で、Rails側では
if ['REMOTE_USER', 'HTTP_X_FORWARDED_USER'].map{|k| request.env[k]}.include? 'expected_name'
とかすると上手くいきました。
あと、mod_rewriteの際、Apache module mod_rewriteは熟読しておく必要があるなぁ、と。