redirectが効かなくて悩む
ある特定のURIを別URIへリダイレクトしてほしいとの要望。
Redirect permanent /hoge /fuga
と書いたがなぜだか全然効かない。
というのも、当該ウェブサーバ自身ではコンテンツをプロバイドしておらず、ほとんどのリクエストをバックエンドへ流しています。プロクシはProxyPassではなく、Rewriteでやっています。
設定ファイルをざっと書くとこんな感じ。
Redirect permanent /hoge fuga RewriteCond %{REQUEST_URI} .* RewriteRule .* http://backend_server%{REQUEST_URI} [P,L]
Apacheの場合、URIの書き換えとか、プロクシとか、リダイレクトには優先度があって、競合する設定があった場合は
rewrite > proxypass > redirect の順の優先されるんですな。この順番ってどこかで読んだんですがどこだったかは忘れた。
なので上記の場合rewriteの".*"とredirectの/hogeが競合しているんですが、rewriteが優先されてredirectの設定は無視される。
なので上記のリダイレクトをしたい場合は、rewriteで実現する必要があります。
RewriteCond %{REQUEST_URI} /hoge RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI} [R,L] RewriteCond %{REQUEST_URI} .* RewriteRule .* http://backend_server%{REQUEST_URI} [P,L]
ちなみにバックエンドへ流す処理をProxyPassでやってる場合だと、ProxyPassで除外設定を書く必要があります。
Redirect permanent /hoge /fuga ProxyPass /hoge ! ProxyPass / http://backend_server/
同じ文字列を設定ファイルの複数箇所に書きたくないのであまりこれは使いたくない。