PATH_INFO を特定のスクリプトに渡す方法
少し前になりますが、[PHP-users 28031] PATH_INFOについてというメールが気になったので調べてみました。
mod_rewrite を使用すれば簡単ですが、それ以外の方法でも一応、可能のようでしたので、メモしておきます。Apache 1.3.34 で確認しました。
mod_mime と mod_actions が必要ですが、Apache をコンパイルすれば標準で有効になっています。
今ごろメーリングリストに出すのも遅すぎるように思いますので、こちらに書いておきます。
質問は以下の通りです。
PATH_INFOにてドメイン直下の値を取得したいのですが、通常の方法では実現で きませんでしたので、方法をご存知の方どうぞよろしくお願いします。 便宜上pathinfo.phpというファイルにて$_SERVER['PATH_INFO']が記述されてい るとします。 http://xxx.xxx.xxx/pathinfo.php http://xxx.xxx.xxx/pathinfo.php/111/222/333/444/ こうすると当然、値は取得できます。 これを http://xxx.xxx.xxx/111/222/333/444/ このような形で取得できないだろうかと苦戦しております。 111や222、333や444はディレクトリとしてそもそも存在してなくて任意の値が来 ると想定し、この値を取得したいのです。
ForceType ディレクティブを使用する方法
まず、この質問の答えではないと思いますが、先に拡張子の付いていないファイル test を PHP スクリプトとして認識させる方法を書いておきます。
これには、ForceType ディレクティブ(Module mod_mime: ForceType directive)を使用すれば可能です。
例えば、http://example.com/test/111/222/333/ のようにアクセスされた場合、/111/222/333/ を受け取りたい場合、
DocumentRoot が /usr/local/apache/htdocs/ で、.htaccess を使用できる場合は /usr/local/apache/htdocs/.htaccess に以下の行を加えます(httpd.conf でも設定可能ですが、以下は .htaccess を使用可能を前提としています)。
<Files test> ForceType application/x-httpd-php </Files>
次に、/usr/local/apache/htdocs/test というファイルに以下のような PHP コードを書きます。
PATH_INFO: <?php if ( isset( $_SERVER['PATH_INFO'] ) ) { echo htmlspecialchars( $_SERVER['PATH_INFO'] ); } ?>
ブラウザで、以下のような URI にアクセスします。
http://localhost/test/111/222/333/444/
結果は以下のようになります。
PATH_INFO: /111/222/333/444/
ただし、この方法では、ディレクトリの最初に test が入っていない場合は任意のディレクトリ部分を受け取ることはできません。
ForceType ディレクティブと Action ディレクティブの両方を使用する方法
ForceType ディレクティブと Action ディレクティブの両方を使用すれば、質問に対する回答の一つになると思います。
Action ディレクティブ(Module mod_actions: Action directive)を使用して、/usr/local/apache/htdocs/.htaccess に以下のように設定します。
# <Files> ディレクティブで囲む必要はありません ForceType application/x-httpd-php Action application/x-httpd-php /index.php
次に、/usr/local/apache/htdocs/index.php というファイルに以下のような PHP コードを置きます。
PATH_INFO: <?php if ( isset( $_SERVER['PATH_INFO'] ) ) { echo htmlspecialchars( $_SERVER['PATH_INFO'] ); } ?>
ブラウザで、以下のような URI にアクセスします。
http://localhost/111/222/333/444/
結果は以下のようになります。
PATH_INFO: /111/222/333/444/
ただし、この場合、http://example.com/ または http://example.com/index.php にアクセスしても PATH_INFO は設定されません。
また、この設定にすると、どんなディレクトリやファイル(HTML ファイルや画像ファイル)を指定しても必ず /usr/local/apache/htdocs/index.php を実行します。
この状態で同じサーバに置かれている HTML ファイルや画像ファイルを扱う場合は、自動的には処理してくれませんので、それぞれの拡張子に応じて PHP 側で処理する必要があります。
パフォーマンスも悪くなりますので、この設定にする場合は、拡張子の設定を加えるか、静的ファイルを扱うサーバを別に用意した方が良いかもしれません。
例えば、.htaccess に以下のように拡張子個別の設定を行えば、対象のファイルが存在すれば PHP に渡らなくなるようです。他にもっと良い方法はあるかもしれません。
<Files ~ "\.html$"> AddType text/html .html </Files> <Files ~ "\.css$"> AddType text/css .css </Files> ForceType application/x-httpd-php Action application/x-httpd-php /index.php