Apache(mod_rails)とmongrelでHTTPレスポンスヘッダに特定の値を返す

Posted filed under Ruby on Rails.

Photo by icanteachyouhowtodoit レスポンスコードでステータスを判断するとFreeSpotとかで問題にならない?からの続き。  ステータスコードで200が帰ってきたときに、ほんとに自分が通信したいサーバから帰ってきたかを検証する方法を考えてみました。  ほんとに相手のサーバを認証したい場合はSSLを使うべきですが、そんなに大事にしたくない場合は、HTTPレスポンスヘッダに特定の値をセットすることで、相手を特定できるのではないかと思います。  Railsのbefore_filterなどでresponse.headersをセットしてもいいのですが、これだとcacheに入った場合など、Railsを通らないときには、ヘッダが追加されません。 そのため、mod_railsの場合はApacheで、mongrelの場合はmogrel内でヘッダにセットする必要があります。  Apacheでは、Headerディレクティブでヘッダを書き換える事ができます。これを使う場合にはmod_headersを有効にしてください。 <VirtualHost *> …. Header set X-AppName sticka </VirtualHost>  mongrelの場合には、config/environment.rbに下記のコードを追加します。 if defined?(Mongrel) && defined?(Mongrel::Rails) class Mongrel::Rails::RailsHandler alias process_without_appname process def process(request, response) response.header[‘X-AppName’] = ‘sticka’ process_without_appname(request, response) end end end  これで、開発で使っているmongrelでも、実環境のApacheでもHTTPレスポンスヘッダのX-AppNameにはstickaが設定されます。  外部からAPIをアクセスする際には、X-AppNameを検証することで、プロキシなどによって勝手にリダイレクトなどをされても、それを検出することができます。