Apache のリライトまとめ (2)

備忘録その2。 (.htaccess に書く場合)
内容が間違っている可能性もありますので、ご参考まで。

RewriteBase はリライト後のベースを指定する

昔は RewriteBase が何なのかよくわからず、おまじない的につけていたこともありました。

RewriteBase は、リライト後のURLベースを指定します。例えばサーバ定義にて、

Alias /hoge "C:\temp"


となっていた場合、ホストが hoge.test とすれば、C:\temp\abc.html があれば http://hoge.test/hoge/abc.html としてアクセスできます。

このとき C:\temp\.htaccess の RewriteRule で以下のようにしたとします。(C:\temp\def.html は存在する)

RewriteRule abc.html def.html


すると abc.html にマッチして def.html にリライトされますが、これは意図したようには動作しません。
これは、リライト時には、ローカルパスのプリフィックス(=ベース部分、この例でいえば C:\temp)を除外してルールの適用が行われるためです。
この場合は、以下のように書かなければなりません。

RewriteRule abc.html /hoge/def.html


複数の RewriteRule があるとき、/hoge をいちいちつけるのは面倒ですし、/hoge から /foo に変わった場合には変更するのも手間です。
ここで C:\temp へは /hoge でアクセスしているということを示すために、RewriteBase を使用します。
つまりこうです:

RewriteBase /hoge
RewriteRule abc.html def.html


このようにすると意図どおりに、http://hoge.test/hoge/abc.html へのアクセスで C:\temp\def.html が表示されます。