SF.net のトラッカー(
http://sourceforge.net/tracker/index.php?func=detail&aid=2073613&grou... )にも上げましたが、英語がとても苦手なため補足しておきます。
fuga さん達と一緒に突っついている OpenID モジュールで fuga さんが Mixi 対応したときに見つけた問題です。
"Legacy_Controller.class.php" と
"Legacy_PublicControllerStrategy.class.php" にて、$_SERVER['REQUEST_URI'] を parse_url() で処理しているのですが、parse_url() では URI のみでは、正常に処理できない場合があるようです。
例えば、GETクエリーが "XOOPS_URL/index.php?http://" であった場合に、parse_url($_SERVER['REQUEST_URI']) は失敗して FALSE を返します。("http://" が URLエンコードされていれば問題はない。)
そこで、自分なりに次のように変更してみたところ、なんとなく上手くいっているようです。
Legacy_Controller.class.php, Line:383 -
//$requestPathInfo = parse_url($_SERVER['REQUEST_URI']);
//$requestPath = isset($requestPathInfo['path']) ? urldecode($requestPathInfo['path']) : '';
$requestPathInfo = explode('?', $_SERVER['REQUEST_URI']);
$requestPath = urldecode($requestPathInfo[0]);
Legacy_PublicControllerStrategy.class.php, Line: 43 -
//$pathArray = parse_url(xoops_getenv('REQUEST_URI'));
//$mid = preg_match("#(/index\.php|/)$#i", @$pathArray['path']) ? -1 : 0;
$pathArray = explode('?', xoops_getenv('REQUEST_URI'));
$mid = preg_match("#(/index\.php|/)$#i", $pathArray[0]) ? -1 : 0;
検証をよろしくお願いします。
修正入れないとデバグモードオフで真っ白ですね。
クエリーやPATHINFOまで含める必要はないと思うので
$requestPathInfo = parse_url(str_replace(@$_SERVER['PATH_INFO'], "", $_SERVER['PHP_SELF']));
と
$pathArray = parse_url(str_replace(@$_SERVER['PATH_INFO'], "", $_SERVER['PHP_SELF']));
でいいんじゃないかなぁ
うちのサイトを上記に変更してみましたが問題なさそうです。
css.phpの時は定数にしちゃいましたが、リクエストファイルを取得する関数とか作ってもいいのかもしれないですね。
PATH_INFOを除いたPHP_SELF、という手段、良さそうですね。
引用:
Marijuanaさんは書きました:
css.phpの時は定数にしちゃいましたが、リクエストファイルを取得する関数とか作ってもいいのかもしれないですね。
これ、本当に欲しいです。
リクエストファイルが欲しい状況はいくらでもあるのですが、その都度、いちいち同じコードを書かなくちゃいけないので。
もっとも、XCLだけに実装されても、私には利用できない…
SCRIPT_NAME は、PATH_INFO が含まれないようなので、
$requestPathInfo = parse_url($_SERVER['SCRIPT_NAME']);
と
$pathArray = parse_url($_SERVER['SCRIPT_NAME']);
でいけそうですが、SCRIPT_NAME が正しく取得できない環境があったような、なかったような・・・
引用:
nao-ponさんは書きました:
SCRIPT_NAME が正しく取得できない環境があったような、なかったような・・・
はい。CGI版では、"/cgi-bin/php" などとなるケースがあります。
* REQUEST_URI
IISでは設定されない。ただし、これが設定されてない環境でも、common.phpの処理で設定し直されるので、common.php以降の処理であれば利用可能
* PHP_SELF
CGI版でもIISでも正しく設定される。ただし、PATH_INFOを含むので、それを外す必要がある。
* SCRIPT_NAME
CGI版では実際に処理する実行可能スクリプトとなるケースがある。(suPHPな環境ではおそらく大丈夫)
Marijuanaさんのコードはそれをふまえて、PHP_SELFから生成しています。
GIJOE さん、とても分かりやすい解説をありがとうございました。

またひとつ賢くなりました。