Tomcatが発行するSet-CookieヘッダのPathパラメータをmod_proxyで書き換える

Wuschel's fauler Freitag
Creative Commons License photo credit: sake028

Tomcatが発行するHTTPレスポンスに含まれるSet-CookieヘッダのPathパラメータを、mod_proxy側で修正してWebブラウザに転送する方法をメモ。

以下のページを参考にさせていただきました。ありがとうございます!

設定方法

ブラウザが受け取るSet-CookieヘッダのPathパラメータの値を、

から

のようにmod_proxyで修正したい場合は、Apacheのコンフィグレーションファイル(httpd.confやmod_proxy.confなど)に以下を追記します。

あとはApacheを再起動すれば設定完了。Webブラウザが受け取るHTTPレスポンスに含まれるSet-CookieヘッダのPathの値が、「/foo」から「/webapp/foo」に変わっていると思います。

めでたしめでたし。

この設定が必要な状況

例えば、ApacheからTomcatに対して、mod_proxy (mod_proxy_ajp)を使って以下のようなリバースプロキシを設定している状況を考えます。

Webブラウザが「http://example.com/webapp/foo」にアクセスした場合、TomcatによってSet-CookieヘッダのPathパラメータの値が「/foo」に設定され、Apacheを介してWebブラウザにHTTPレスポンスが返されます。

レスポンスを受け取ったWebブラウザは、「/foo」というパスに対応する形でCookieの値を保存します。しかし、Webブラウザはサーバ上の「/webapp/foo」というパスに対してアクセスしているため、今後「/webapp/foo」以下のページにアクセスする限り、先ほど保存したCookieの値がサーバに送信されることはありません。

Webブラウザがサーバーから受け取ったCookieの値が、Tomcatに配備されているWebアプリケーションが動作する上で重要なデータだったとしたら問題です。Webアプリケーションがその値を取得することができないので、事前に想定していないおかしな挙動をしてしまう可能性が出てきます。

そこで、今回紹介した設定方法の出番です。mod_proxyがSet-CookieヘッダのPathパラメータの値を「/webapp/foo」に書き換えるように設定することで、Webアプリケーションが正常に動作することが期待できます。

まとめ

実際にTomcat + mod_proxy_ajpの設定を行っていたときに、これが原因でWebアプリケーションが動かず小一時間ハマってしまったので、まとめておきました。このような問題がおきるケースがあるということを知らなかったので非常に勉強になりました。

リバースプロキシの設定を変えながらサーバから送信されてくるHTTPレスポンスをモニタリングしているときに、CookieのPathパラメータの値が常に一緒だったので「もしかして」と調べたのが問題解決のきっかけでした。気付いてよかった。パケットモニタリング大切ですね。

それでは!