Apacheのmod_proxyにハマった件

問題

自鯖で公開している

http://ponkotuy.com/maps/

という地図のサービスがあるのだが、こいつが最後の/を外すと、ページ内の相対リンクの解決に失敗して死ぬ問題が割と長い間未解決で残っていた。

構造としては、まずApacheがリクエストを受け取って、mod_proxyのリバースプロキシの機能を使って同じサーバ内の9000ポートのPlayframeworkのプロセスにアクセスする構造。

Proxyを経由しないと最後の/を付けても付けなくても変わらないので、明確にProxyが原因である。

問題のあるhttp.conf

この部分の設定は以下のようになっていた。

ProxyRequests Off

ProxyPass /maps http://localhost:9000
ProxyPassReverse /maps http://localhost:9000

この状態だと、どうやら「頭が/mapsであるURL全てが一致する」らしく、/maps/も/mapsも一致する。

修正

であれば、とりあえず最後に/の無いURLを弾いてみる。

ProxyRequest Off

ProxyPass /maps/ http://localhost:9000/
ProxyPassReverse /maps/ http://localhost:9000/

これで最後に/の無いURLを弾けた。

あとは/がある奴にRedirectすれば良いのでは?

Redirect /maps /maps/

を最後に追加してみたら期待した通りの動作になった。やったね。

余談

Play使ってて似たようなことやる人はそこそこいると思うので参考程度に。実は自鯖で立ててるPlayのサービス3つぐらいあるので、他の奴も順次設定してこうかなーと思っている。

あと途中でmod_dirの自動で/を付与したURLにリダイレクトする機能とか使っても解決できるかもしれないが、自分には無理だったので試すなら自分で試してみてね。あとボクに教えてくれると大変うれしいです。