親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。育児のイロハという育児サイト(https://ikujip.jp)の開発も行っているため、その開発で使用されている技術についても掲載しています。

ApacheとTomcatの連携でリダイレクトが上手くいかない

Javaで組まれたWebサイトをApacheTomcatを連携させて動かしているのですが、
先日サイト改修により一部ページのURLも変更させた時のリダイレクト設定について苦労したのでそれについて書きます。
やりたいことは、「http://ドメイン/test/sample.html」とアクセスされた時に「http://ドメイン/test/sample/1」に遷移されるようにすることです。
Apacheのバージョンは2.4になります。

元々は以下のようにRewriteRuleとProxyPassを記載していました。

RewriteEngine On
RewriteRule ^/test/sample.html$ http://test/sample/1 [R=302,L]

ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/

僕が調べた感じだと、RewriteRuleとProxyPassで設定が競合する場合はRewriteRuleの方が優先されるようなので、
この設定で大丈夫かと思っていたのですが、リダイレクトしてくれずにProxyPassでTomcat側に飛んじゃいました。
どうやったらリダイレクトした後にTomcat側に飛んでくれるのかわからず、長時間の戦いでした。
結果的にRewriteRuleを使った形では解決できなかったのですが、
代わりにRedirectを使うことで回避させました。
他にもっと適切な方法がある気がしてならないのですが(間違いなくあるでしょうねw)、
以下の形にしてみました。

Redirect permanent /test/sample.html /test/sample/1

ProxyPass /test/sample.html !
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/

ProxyPassで「!」をつけると例外扱いになり、他のURLと違ってTomcat側に飛ばされることがないのです。
本来であればProxyPassとRedirectであればProxyPassの方が優先されるのですが、
ProxyPassで例外扱いにしてやれば競合から外れるのでRedirectに設定した動きをしてくれるのです。

再三繰り返しますが、きっと他にもいいやり方あるでしょうね。