Displaying posts written in

8月 2009

mod_rewriteとPHP_SELFの関係

mod_rewrite でURLを書き換える場合の PHP_SELF の値は、RewriteRule を .htaccess に書くか httpd.conf に書くかによって違ってくる。http://example.com/foo/bar を http://example.com/index.php に書き換える場合について例示すると以下のようになる。

.htaccessに書く場合

RewriteRule ^foo/bar$ index.php

index.php でアクセスできるPHP_SELFの値は /index.php になる。

httpd.confに書く場合

RewriteRule ^/foo/bar$ /index.php

index.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から推測)。