mod_proxy_balancerとSet-CookieヘッダのPath属性
ちょっと調べてみたら、書き換えるためのディレクティブが用意されてました。同様にProxyPassReverseCookieDomainディレクティブもあります。
たとえば、
ProxyPassReverseCookiePath ディレクティブ使用法は基本的に ProxyPassReverse と同じですが、ヘッダの URL の代わりに Set-Cookie ヘッダの path 文字列を書き換えます。
- フロント:Apache2.2(mod_proxy+mod_proxy_http+mod_proxy_balancer)
- バックエンド:Apache2.2(PHP)
のような構成でバランシングしている場合で、バランシングの設定が
LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so ProxyPass /balancer balancer://hostname/ <Proxy balancer://hostname> BalancerMember http://hostname:8081/~shimooka/ keepalive=On loadfactor=1 BalancerMember http://hostname:8082/~shimooka/ keepalive=On loadfactor=1 </Proxy>
だとします。この場合、フロント側のURL「http://hostname/balancer/〜」でバックエンド側の「http://hostname/~shimooka/〜」にアクセスすることになりますが、
<?php session_set_cookie_params(0, '/~shimooka/'); session_start(); echo 'PHPSESSID=' . session_id() . '<br>';
のようなスクリプトを実行すると、CookieのPath属性がフロントのURIと一致しないので、結果的に毎回新しいセッションが作成されることになります。ということで、バランシングの設定に
ProxyPassReverseCookiePath /~shimooka/ /balancer/
を追加してやると、PHPスクリプトで発行したセッションCookieのPath「/~shimooka/」が「/balancer/」に書き換えられてブラウザに返されます。
ちなみに、
ProxyPassReverseCookiePath /~shimooka /balancer/
としてしまうと、Path属性が「/~shimookaaaaaaa」でもマッチしてしまうので注意が必要です。