Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

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」でもマッチしてしまうので注意が必要です。