mod_rewrite でURLを書き換える場合の PHP_SELF の値は、RewriteRule を .htaccess に書くか httpd.conf に書くかによって違ってくる。http://example.com/foo/bar を http://example.com/index.php に書き換える場合について例示すると以下のようになる。
.htaccessに書く場合
RewriteRule ^foo/bar$ index.phpindex.php でアクセスできるPHP_SELFの値は /index.php になる。
httpd.confに書く場合
RewriteRule ^/foo/bar$ /index.phpindex.php でアクセスできるPHP_SELFの値は /foo/bar になる。
フレームワークの中には .htaccess で書き換えることを前提としてパス処理を行っているものがあり(CakePHP 1.2など)、httpd.confで書き換えをする場合には何らかの回避策をとる必要がある。
(1) PTオプションを使用する
RewriteRule に passthrough|PT オプションを指定する。
RewriteRule ^/foo/bar$ /index.php [PT]このオプションを指定した場合、書き換え後のURLに対してAliasやRedirectの適用が行われるようになることに注意(元々そういった用途に使うためのオプション)。
(2) フレームワークレベルで設定する
CakePHP 1.2の場合はindex.php内Dispacherクラスのコンストラクタ第2引数で、PHP_SELFに替わる基準パスを指定できる。
$Dispatcher = new Dispatcher(null, ''); //空文字列でルートを意味する
……
技術的に言うとこれはURL書き換え時に request_rec 構造体の uri メンバを書き換えるか否かの違い。.htaccess でURLを書き換えた場合は書き換え後のURLに対して internal-redirect が発生するらしく、結果として handler の中から書き換え後の uri が見えるようだ(RewriteLogから推測)。
