PukiWikiのURLの整形(その1)

PukiWikiをバージョンアップしたついでに、URLの整形をやってみた。http://host/?Pagehttp://host/Page/ または http://host/Page.html という形式にする。後者はちょっとあざといので、前者の形式を目指す。
調べてみると方法は2通りあって、PATH_INFO を使ってページ名を受け取る方法と、mod_rewriteを使ってもとの?を使った形式に書き換える方法。

PATH_INFO を使う方法だと、http://host/index.php/Page/ のようにURL中にPHPファイル名を出さざるを得ないので、まずは mod_rewrite を使う方法を考えた。

RewriteRule ^(.*[^/])/?$ index.php?$1 [L]

ただし、全URLを書き換えると、image や css 、js 等のファイルをそのまま示すURLがおかしくなってしまうので、

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*[^/])/?$ index.php?$1 [L]

のようにファイルやディレクトリで無いときだけ書き換えるようにする。そうすると今度は、前回 id:otn:20060523 id:otn:20060525 に書いたような、http://host/edit.php/Page/ の時に書き換え対象にならない。逆にこの場合は、URL中にPHPファイルが入るので、PATH_INFOが使える。


というわけで、両方の方法を併用する必要がある。どうせ、PATH_INFOを見るんだからと、

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

にしてみたが、こうやると、http://host/Page/ の時に、"No input file specified" というエラーが出る。このエラーメッセージで検索してみると、IISの場合とか、DocumentRootが違っていたとかいう情報ばかりで、よくわからない。PHPcgiとして動いているせいではないかと思って、apacheモジュールとして動いているサーバーでやってみるとうまく行く。どうもcgi環境であるせいのようだ(未確認)。


あらためて要件を整理すると、
(1) さくらインターネットの共用レンタルサーバーで、PHPはSuExecのcgiで稼動する
(2) http://otnx.jp/CMD/Page/ および http://otnx.jp/CMD/edit.php/Page/ というURLでPageにアクセスできること
(3) 階層になったページ名は、http://otnx.jp/CMD/Dir%2FPage/ でなく、http://otnx.jp/CMD/Dir/Page/ と / を区切りにする


(2) の後半は表に出ないURLなので、http://otnx.jp/CMD/edit.php?Page でもいいのだが、URLを生成するスクリプトの都合を考えると、統一された形式がいいだろう。

つづく。