リバースプロキシでの環境変数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は熟読しておく必要があるなぁ、と。