mod_rewrite

最終更新日時:2014-05-19 17:52:15
Apache

概要


mod_rewriteを使うことにより、様々なURLの書き換えやリダイレクトを設定することができます。
その1つ1つを挙げていくのはキリがないので、ここではよく使う書き方をメモ程度に羅列していこうと思います。

QUERY_STRING


QUERY_STRING付きのURLをmod_rewriteでリダイレクトしたりすると、自動的にQUERY_STRINGが付加されてしまったりします。
そこで、リダイレクト後の URL に QUERY_STRING を付けたくない場合には、URLの最後に単に"?"だけを記述するようにします。

 RewriteRule ^/xxx/.* http://xxx.xxx/? [R=301,L]



mod_rewriteと正規表現


RewriteRule 中には正規表現を書けるのですが、Apache-1.3 系と Apache-2 系では使える正規表現が異なります。

Apache-1.3:POSIX正規表現
Apache-2:Perl互換正規表現(PCRE)

例えば、よく使われる \w という表現。
これは、PCRE にあって POSIX には無い表現なので、Apache-1.3 系では動きません。
Apache-1.3 から Apache-2 に移行する、、、といった際には要注意ですね。


RewriteRuleとAlias


RewriteRule と Alias という似たような機能を組み合わせたいことがあります。
が、どうも個人的に使っている感覚では、この2つは相性がよくない気がします。。。

例えば、

 RewriteRule /test1 /test2
 Alias /test2 /test3


と設定した場合。

/test1 にアクセスした際には、当然 /test3 に行って欲しいわけですが、RewriteRule 後は Alias 変換の処理は入らないようなので、/test2 に遷移してしまいます。
こんな動きをして欲しいケースってあるの??という感じですが。

回避策としては、

 RewriteRule /test1 /test2 [PT]
 Alias /test2 /test3


のように、[PT] フラグを付けてあげると RewriteRule 後も Alias 変換が有効になってくれるのですが、

現在の Apache API が URI-to-filename フックに加えて filename-to-filename フックを持っていれば、このフラグを 使う必要はないのです!
しかしこのようなフックがない現在、 このフラグが唯一の解決策となります。
Apache グループは この問題について議論しており、Apache バージョン 2.0 には そのようなフックが追加されることでしょう。


などと書かれていたりもするので、将来的にはあまりよろしくない指定方法になる可能性もあり、結論としては、なるべく Alias と RewriteRule は組み合わせて使用しない方が良い、、、、ような気がしますね。

ちなみに、これに Web アプリ側の Redirect と組み合わさると、本当に複雑怪奇な動きになったりするので、極力これらを組み合わせて使用することは避けた方が良いと個人的には思います。

お問い合わせは 掲示板 にて。