AN HTTPDで PHPの最新バージョンを使い PHP_SELFを取得するには

更新日:2004.06.03
作成日:2003.10.01

 AN HTTPDで PHP 4.3.0 あるいは 4.3.1 以外のバージョンを使うと
PHP_SELF がセットないために動作しないPHPスクリプトが結構あります
(XOOPS, XOOPS2, レッツPHP!で配布されているものなど)。

(注) これは実行プログラムが php.exeの場合だけで、ISAPI(php4isapi.dll)では
 どのバージョンでもセットされるが、ISAPIでは他の原因で動作しないことがあり、
 AN HTTPDでは php.exe を使うことが鉄則になっている。

検索してみると Apache+PHP 4.3.0 で PHP_SELF が正しくセットされない
ということがあったようで、そのときの議論を見つけました。
	http://bugs.php.net/bug.php?id=21261

 この中に php.iniの auto_prepend_file を設定し、各 PHPスクリプトの頭で
prepend したコードを実行させればうまくいったという話があります。

AN HTTPDでもこれを真似て以下を試してみました。

 AN HTTPDでは SCRIPT_NAMEは正しく取得できているので、PHP_SELF を強引に
SCRIPT_NAME と同じ内容に設定してしまおうという魂胆です。

・以下の内容のファイル prepend.phpを作成し、c:\php\includesに保存する。
------------------------
<?php
$PHP_SELF =
$SCRIPT_NAME =
$_SERVER['PHP_SELF'] =
$HTTP_SERVER_VARS['PHP_SELF'] = ←(XOOPS2などで必要なので、この行を追加した)
$_SERVER['SCRIPT_NAME'];
?>
------------------------

・php.iniの以下の2箇所を変更する。
----------------------------------
auto_prepend_file = "prepend.php"
include_path = ".;c:\php\includes" (UNIXではなく Windowsの方。1桁目の ; は削除)
----------------------------------

これで PHP_SELF が設定され、無事動作するようになるケースがあります。

本当は PHP_SELF と SCRIPT_NAME は以下の説明にあるように別物のようです。
	http://www.php.net/manual/ja/reserved.variables.php
	http://ns1.php.gr.jp/pipermail/php-users/2003-June/016472.html

例えば以下のようなスクリプトを実行したとすると
	http://127.0.0.1/sample/test.php/foo.bar

それぞれ以下のような結果になるのが本来だそうです。
	PHP_SELF: /sample/test.php/foo.bar
	SCRIPT_NAME: /sample/test.php

 上記の例のように PATH_INFO でなければ PHP_SELF と SCRIPT_NAME は同一になり、
そういう使い方の方が多いと思います。

 PHP 4.3.0/4.3.1 等 AN HTTPDで PHP_SELF が得られているバージョンで
上記の PATH_INFO の例は本来異なるはずの PHP_SELF と SCRIPT_NAME が同じです。

 この方法があらゆるケースでうまく動作するのか、また何か別の問題が
起きないかなど不明なところもありますが、最新バージョンの PHPを使ってみたい
という方は試してみてください。

 PHP_SELFでつまずいていない方は何もこんなとこをする必要はなく、
時間も余計にかかるようになるだけでいいことはありません。

 こういう方法でできると書いた人が "quick & dirty workaround" と言っているので
あくまで「美しくないその場しのぎの回避策」であることの認識が必要かと思います。


【応用編】

 AN HTTPDでPHPの実行プログラムを ISAPI(php4isapi.dll)にすると、
基本認証が失敗するという症状が出る。

中田さんの説明(下記の過去ログ参照)によると
 http://homepage1.nifty.com/yito/namazu/gbook/20021209.0310.html

ISAPIでは PHP_AUTH_USER と PHP_AUTH_PW はセットされないとのことである。
AUTH_USER と AUTH_PASSWORD は php.exe でも php4isapi.dll でもセットされる
ということなので PHP_AUTH_USER と PHP_AUTH_PW にそれぞれ
AUTH_USER と AUTH_PASSWORD を代入してやれば何とかなりそうである。

実際、上記の $PHP_SELF と同様に prepend.php を以下のように書き替えれば
ISAPIでの基本認証が可能であることが確認できた。

---------------------------
<?php
$PHP_SELF =
$SCRIPT_NAME =
$_SERVER['PHP_SELF'] =
$HTTP_SERVER_VARS['PHP_SELF'] =
$_SERVER['SCRIPT_NAME'];
$PHP_AUTH_USER =
$AUTH_USER =
$_SERVER['PHP_AUTH_USER'] =
$_SERVER['AUTH_USER'];
$PHP_AUTH_PW =
$AUTH_PASSWORD =
$_SERVER['PHP_AUTH_PW'] =
$_SERVER['AUTH_PASSWORD'];
?>
---------------------------

PHPで ISAPIを使いたいが認証失敗で使えないという人は試してみるといいだろう。
ただ、XOOPSにおける「ユーザ名」「パスワード」の入力処理は基本認証ではないので
上記のように prepend.phpを書き替えたとしても ISAPIではログインはできない。


作成:いと,mailto:gfh05223@nifty.com