mod_proxy mod_proxy_balancer と mod_dirを使う時の注意


mod_proxy を使って、バックエンドサーバーにリクエストを振り分けていたときの話です。

    ServerName www.example.com


    ProxyPass / balancer://cluster/ 
    ProxyPassReverse / balancer://cluster/

   <Proxy balancer://cluster/>
     Balancermember http://bk1.example.com loadfactor=50
     Balancermember http://bk2.example.com loadfactor=50
   </Proxy>

上記のように設定して、www.example.combk1.example.com と bk2.example.com にリクエストがそれぞれ渡されます。

ここで、bk1 や、bk2 側で、mod_dir を利用したリダイレクトが起こった場合に
クライアントに戻されるURLが問題になりました。

クライアント → http://www.example.com/test → http://bk1.example.com/text

                          ↓ mod_dir 

クライアント ←  http://bk1.example.com/test/ ← http://bk1.example.com/test/

mod_dir は、URLがスラッシュ(/)で終わっていないときに、スラッシュをつけたURLに変換してくれます。
ただし、リダイレクトのURLがどうも http:// からのフルパスで変換するみたいで
バックエンドサーバーのServerNameのままクライアントにリクエストを返してしまいました。

    ProxyPassReverse / balancer://cluster/

上記を設定しているのでURLの書き換えをしてくれると思ってたのですが
どうも書き方が違うらしく

    ProxyPassReverse / http://bk1.example.com/
    ProxyPassReverse / http://bk2.example.com/

こう書くことで、意図したURLの書き換えをしてくれました。

しかし、ProxyPassReverse / balancer://cluster/ この記述は、何をしてるんですかね?
URLを書き換えてくれなければ、意味がないと思うのですが。。。