We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 33014 ☆ A M B ☆
    • 1,231 Posts
    あれ?PATH_INFOありますね。ORIG_PATH_INFOではなくて。
    そしたらZeRoさんのいうとおり、test.php?test123とかtest.php?test/test123みたいな形でURLを叩いてみて、上記の出力を出してみていただけますか?
    たぶん予想では、test123やtest/test123などの値が得られているはず。

    とすると、MODxへの組み込みというよりbbclone自体に何か問題がある可能性がありますね。
      • 33488
      • 429 Posts

      ところで ZeRo さんも yama さんもご自分のサーバーなどでは確認できないんでしょうか。・・・きょうはすこし早く寝ようと思うので明日になるかもしれません。

      Yamaさんと同様にさすがにそこまでは・・・とは思ってはいたんですが、夜更かしついでに1回だけ試してみました。
      結果としては、おっしゃる通りの現象が発生してますね。
      やはり、MODxのrewriteルールが動くのでPATH_INFOが設定されないのが原因でしょう。

      で、いずれにしてもbbcloneを改造する必要はありそうですが、無理やりPATHを出すとしたらhtaccessの記述をちょっと変更して

      # The Friendly URLs part
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^(.*)$ index.php/$1?q=$1 [L,QSA]
      


      index.php/$1とすれば一応PATH_INFOは渡ります。
      が、BBCLONEのグローバル統計ではリンク先がhttp://PATH_INFOになっちゃいます。
      ホスト名を付けたリンクにすれば使えそうなんですが、これはBBCLONEの方の修正をすることになるかと思います。

      ということで、相性的にはMODxとBBCLONEはイマイチ悪そうですねぇ。

        • 6350
        • 421 Posts
        Quote from: ZeRo at Jan 11, 2009, 11:09 AM

        # The Friendly URLs part
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteRule ^(.*)$ index.php/$1?q=$1 [L,QSA]
        


        index.php/$1とすれば一応PATH_INFOは渡ります。
        が、BBCLONEのグローバル統計ではリンク先がhttp://PATH_INFOになっちゃいます。
        ホスト名を付けたリンクにすれば使えそうなんですが、これはBBCLONEの方の修正をすることになるかと思います。

        ということで、相性的にはMODxとBBCLONEはイマイチ悪そうですねぇ。

        上記のような htaccess を指定すると modx の トップページ以外では No input file specified. というエラーになります。

        下のようなテストコードを実行してみました

        test.php/abc/def
        <?php
        $_SERVER['PATH_INFO'] = '/xxxx/';
        ECHO 'PATH_INFO->'.$_SERVER['PATH_INFO'].'<br />';
        define("_BBC_PAGE_NAME", "test");
        define("_BBCLONE_DIR", "bbclone/");
        define("COUNTER", _BBCLONE_DIR."mark_page.php");
        if (is_readable(COUNTER)) include_once(COUNTER);
        ?>

        echo の結果は /xxxx/
        bbclone に書き込まれたパスは http://www.example.com/test.php/def となり /abc が抜けてしまいます。
        どうして http://www.examle.com/xxx/ にならないのか不思議です。bbclone の内部処理では PATH_INFO を使っていないとしか思えません。

        $_SERVER[’PATH_INFO’] = ’/xxxx/’; の行を削除しても結果は同じです (・・?
        ここでは modx は関係ないので相性の問題ではないと思いますが

        ただし modx の index.php のなかで $_SERVER[’PATH_INFO’] = ’/xxxx/’;のように指定した場合書き込まれると結果が違うんですよね
          • 33488
          • 429 Posts
          相性といったのはロジック的に向いてないっていうことです。
          上記の結果からすればMODxの問題じゃなくてBBCLONE側という感じにしか思えないんですが・・・。

          ちなみに昨夜のテストにおいては、エラーとなることはありませんでした。
          なお、テストサーバはXREAですのでさくらのCGIのPHPとは違いますから、APACHEの環境なども絡んでくるかと思います。
          また、以前の書き込みにあるように使われているサーバではORIG_PATH_INFOが入ってるらしいのでそっちの値が使われるんじゃないでしょうか?
          BBCLONEに何が書き込まれているのかを調べた方が早いでしょう、bbcloneのlib/maker.phpの最後の部分に
              $REQUEST_URI = $this->filter_uri($filename, $PATH_INFO , $PHP_SELF);
              $HTTP_USER_AGENT = !$HTTP_USER_AGENT ? "unknown" : $HTTP_USER_AGENT;
              // Use a page name even if the user didn't specify it
              $page = defined("_BBC_PAGE_NAME") ? bbc_clean(_BBC_PAGE_NAME, $BBC_SEP) : $this->auto_page_name($REQUEST_URI);
          
              // "unknown" is meant as placeholder for the hostname, which will be processed at a different location
              $this->string = $time.$this->sep.$prx_addr.$this->sep.$REMOTE_ADDR.$this->sep."unknown".$this->sep
                             .$HTTP_USER_AGENT.$this->sep.$HTTP_REFERER.$this->sep.$REQUEST_URI.$this->sep.$page."\n";
          

          このREQUEST_URIが書き込まれるPATHだと思われますので、ここら辺りをデバック出力すれば見えてくるかと思われます。
          いずれにしてもBBCLONE周りなので・・・
            • 6350
            • 421 Posts
            Quote from: ZeRo at Jan 11, 2009, 11:50 PM

            このREQUEST_URIが書き込まれるPATHだと思われますので、ここら辺りをデバック出力すれば見えてくるかと思われます。
            いずれにしてもBBCLONE周りなので・・・
            今日は朝の10時より↑この辺を見ていました。Gyao の アンドロメダ シーズン1と画面を切り替えながら・・・ :’(

            基本的にテスト用のコートと modxの index.php から呼び出された場合に bbclone の挙動が違うのは確実です。
            bbclone は呼び出し方によって挙動が違うようなのです。

            テスト用のコードから
            test.php/123/456.html のような呼び出しをされた場合 test.php の部分を削除して /123/456.html が bbclone に記録されます。でも modx から呼び出された場合 index.php/123/456.php の index.php の部分は最初から有りませんから/123 がさくじょされて/456.php と記録されるはずですが違うようです。文章で説明しようとするとこのあたりかなり複雑で自分でも結論が出せない状態です。

            modx から 呼び出された場合ににも最初の /123 の部分を削除しようとすると思われるのですがこの時点での PATH_INFO (marker.php 321行目) にはなぜか http://ドメイン名/bbclone となっているようです。この違いがわからない限り問題の解決は難しくお蔵入りとなりそうです。

            結果論から言えば実際には / だけしか access.php には記録されていないようなのです。いずれにしても marker.php 内の function bbc_marker() 321行目から呼び出される filter_uri の内部処理の問題かと思っておりますがここの中での引き算とか理解できない部分もあります。PATH_INFO がそのまま使用されていないのは確実です。

            PHP にうとい僕にとってはここがかなりの難関となっております。modx の キャッシュは関係ないようです。
              • 6350
              • 421 Posts
              結果報告

              bbclone/lib/marker.php 321行目を以下のように変更
              $REQUEST_URI = $this->filter_uri($filename, $PATH_INFO , $PHP_SELF);
                    ↓
              $REQUEST_URI = $_SERVER["REQUEST_URI"];

              たぶんこれで modx、WordPress、Joomla など一般的な CMS には対応できるはずと思います。
              modx の index.php 内での PATH_INFO の退避、復活は必要なさそうです。

              ご協力いただいた yama さん、ZeRo さん、sama55さん ありがとうございました。 laugh
                • 33014 ☆ A M B ☆
                • 1,231 Posts
                お。もうほぼ解決みたいな感じですが。このfilter_uri()っていう関数通さなくても大丈夫ですか?
                実際のコード見てないですが、脆弱性対応な処理が入ってたりしないでしょうか?
                  • 26012
                  • 324 Posts
                  話が少し横道にそれますがお付き合いください。

                  このスレを最初に見たとき、「なんでbbcloneを呼び出す数行のスニペットを作ってテンプレートの最後に入れないのだろう」という素朴な疑問が沸き、以下の順序で私も試してみました。結果はすべてNG。DEBUGモードで動かすと必ず「bbcloneの処理の限界です。このエラーがなくなるまで呼び出し位置を変えてください。本件は次期バージョンで対処予定」みたいなエラーが出てどうにもなりませんでした。動いてない現状では、私が根本的なミスを犯している可能性は依然残ってますが、この時点で、dainitiさんが2ヶ月も苦労され、このスレがindex.phpの改造から話が始まっているのかが読み取れた気がしました。

                  トライ1)
                   方式 : bbcloneを呼び出す数行のスニペットを作ってベースとなるテンプレートの最後で呼び出してみる
                   結果 : 挿入部にbbcloneがちゃんと動いた時のコメントが入らず、bbcloneを表示させても全く変化なし
                         DEBUGモードで動かすと上記エラーメッセージが表示される。

                  トライ2)
                   方式 : 呼び出すタイミングが悪いのかと思い、プラグインを作って以下のイベントでそれぞれ呼び出してみる
                  //case "OnLoadWebPageCache":
                  //case "OnWebPageInit":
                  //case "OnWebPagePrerender":
                  //case "OnWebPageComplete":
                   結果 : 同上 (T_T)

                  もしよかったら、index.phpを改造するに至った理由からはじめて最終的な実装方法まで、簡単で構いませんのでこのスレのまとめとして表現してもらえると私は勿論読者の皆さんにも判り易いと思うのですがどうでしょう(dainitiさん、ヘトヘトなのにすみません)。
                    • 6350
                    • 421 Posts
                    Quote from: yama at Jan 12, 2009, 05:17 PM

                    お。もうほぼ解決みたいな感じですが。このfilter_uri()っていう関数通さなくても大丈夫ですか?
                    実際のコード見てないですが、脆弱性対応な処理が入ってたりしないでしょうか?
                    filter_uri() はセキュリティーのためではなく index.php/123/456.html から /123/456.html を取り出すための関数のようです。
                    したがって最初から /123/456.html のような呼び出し方をされる cms というかやはり htaccess 内でのmod_rewite の定義方法の考え方が bbclone 作者の方はそちらの方が普通なんでしょう。

                    さらに filter_uri() では index default から呼び出された場合のみ処理を分岐しているようで test.php/123/456.html の呼び出しをされた場合と結果が異なるのは当然のようです。

                    および mod_rewite が定義されている場合には index.php/123/456.html の呼び出し方でないと PATH_INFO に値が格納されないという事実もわかりました。このことを前提に bbclone 作者は filter_uri() 関数を用意しているようです。また REQUEST_URI がすべてのレンタルサーバーで利用できるとは限らないというのも理由のひとつだと思います。

                    Quote from: sama55 at Jan 12, 2009, 08:53 PM

                    このスレを最初に見たとき、「なんでbbcloneを呼び出す数行のスニペットを作ってテンプレートの最後に入れないのだろう」という素朴な疑問が沸き、以下の順序で私も試してみました。結果はすべてNG。DEBUGモードで動かすと必ず「bbcloneの処理の限界です。このエラーがなくなるまで呼び出し位置を変えてください。本件は次期バージョンで対処予定」みたいなエラーが出てどうにもなりませんでした。動いてない現状では、私が根本的なミスを犯している可能性は依然残ってますが、この時点で、dainitiさんが2ヶ月も苦労され、このスレがindex.phpの改造から話が始まっているのかが読み取れた気がしました。
                    単純にスニペットを作るスキルがないことです。また環境変数の退避が必要であることからスニペットだけでは解決できないはずです。呼び出し部分はテンプレートのフッターに入れてもよさそうですがあまり効率がいいとは思えません。さらに index.php の中でまとまっているほうが見渡しがいいというのが理由です。

                    また2ヶ月も苦労したわけではなくあきらめていただけでそのあいだボーッ・・としてました。またその間このフォーラム自体が初歩的な書き込みが見当たらないため初めて書き込みをするまでためらいがあったというのが理由です。

                    そのためらいも thr さん sama55 さん yama さん ZeRo さん達の親身な対応でかなりほぐれました。改めて御礼を申し上げます。また最初から解決方法を回答するのではなくヒントから始まり最終的には質問者自体が解決しなければならないという方向に導いてくれたことにも感謝しております。

                    またこれまでに至った経緯詳細、解説はのちほど書き込みさせていただきます。 laugh
                      • 6350
                      • 421 Posts
                      まとめ modx 0.9.3 bbclone-0.4.9b-utf8 レンタルサーバーさくらスタンダードの場合

                      • index.phpを改造するに至った理由
                        とくに理由はありません。単純にフォーラム検索でそのような例しかなかったからです。ほとんどがアルファベット圏のものばかりしかヒットせず国内での modx ユーザーは bbclone 使わないのかと思ってました。それにページ名も関数で取ってこれるのでテンプレートに書くよりも効率がいいと思いました。他のCMSにも応用できる方法だと思います。古いですが英語版の閲覧用スニペットもあるようなのでそれを利用してみるのもいいかもしれません。
                      • 環境変数の退避
                        以下の処理は bbclone の統計画面でページリンクが必要のない場合、および詳細統計画面でどこから来たかのリンクが必要のない場合にはまったく意味のないものとなります。

                        modx/index.php 52行目で呼ばれる /manager/includes/protect.inc.php 内で ’PHP_SELF’,’HTTP_USER_AGENT’, ’HTTP_REFERER’, ’QUERY_STRING’ などが XSS対策のため htmlspecialchars() でエンコードされているためこの四つの環境変数を退避することにします。フォーラムで検索されるサンプルコードはほとんど2年以上前のもので ’HTTP_USER_AGENT’,’HTTP_REFERER’ を使った例しかありませんが現状の bbclone との組み合わせ及びフレンドリーURL使用時の mod_rewite の設定しだいでは少し違ってくるようです。すべての FAQ では最低 modx のバージョン表記は必要だと思います。後で見るとわからなくなるので。

                        HTTP_REFERER を退避している理由はGoogle検索の文字列中の & が &amp;amp; に変換されてしまうためですが bbclone/lib/referrer.php でデコードされるはずがこのキーワードとシングルコーテーションのキーワードなどをこちらに追加すればこれも退避の必要はないかもしれません。&amp;amp; となっているのはさくらサーバーの PHPライブラリーのバグでしょうか?サーバーによっては再現しない場合もあると思います。QUERY_STRING は退避しなくても今のところ問題なさそうですが気になる方はこれも付け加えてください。

                        環境変数を保存することに yama さんのように脆弱性を気にする方もおいでるようですが modx 実行時にはエンコードされた状態なので心配ないはずです。ただしbbclone に保存されたリンクをクリックする場合には自己責任となります。 modx/index.php の先頭には以下のコードを挿入します。
                      $HTTP_USER_AGENT = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '';
                      $HTTP_REFERER = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
                      $PHP_SELF = isset($_SERVER['PHP_SELF']) ? $_SERVER['PHP_SELF'] : '';

                      • bbclone の改造
                        フレンドリーURLの呼び出し方で
                         (1) index.php/abc/def.html
                         (2) abc/def.html ・・・htaccess の設定で index.php がリダイレクトされている場合

                        のような呼び出し方がありますが bbclone では (1) の方法およびフレンドリーURLを使わない場合を前提としておりこの場合以下の改造は不要です。 modx をはじめとするほとんどの cms で htaccess の使えるサーバーではほとんどが (2) の方法で運用されているはずでこの場合には bbclone/lib/marker.php の 321 行目を以下のように書き換えます。

                        $REQUEST_URI = $this->filter_uri($filename, $PATH_INFO , $PHP_SELF);
                        ↓
                        $REQUEST_URI = $_SERVER[’REQUEST_URI’]);


                        この方法は REQUEST_URI が利用できるサーバーのみで使える方法です。REQUEST_URI が利用できない場合は少ないと思いますがまれにそのようなサーバーを利用している場合には他の方法を考える必要があります。filter_uri() 内部ではREQUEST_URI のサポートされていないサーバーを利用した場合を考えての処理をしているようですが、フレンドリーURL (2) の方法を使った場合 PATH_INFO,PHP_SELF ともに変数がセットされないため filter_uri() の呼び出し自体が無意味となってしまいます。そのために PHP_SELF 環境変数の退避も必要ないということになります。bbclone の全角文字化けについては他のサイトを参考にしてください。
                      • 環境変数の復活と bbclone の呼び出し
                        modx/index.php の最後部 $modx->executeParser(); の呼出し後に以下のコードを挿入します。
                      $_SERVER['HTTP_USER_AGENT'] = $HTTP_USER_AGENT;         // 必要な環境変数を復活します
                      $_SERVER['HTTP_REFERER'] = $HTTP_REFERER;
                      $_SERVER['PHP_SELF'] = $PHP_SELF;
                      $page_title=$modx->documentObject['pagetitle'];         // ページタイトルを取得します
                      $bbclone_path=$modx->config['$base_path']."bbclone/";   // bbclone のパスにあわせてセットしてください
                      define("_BBC_PAGE_NAME", "$page_title");
                      define("_BBCLONE_DIR", $bbclone_path);
                      define("COUNTER", _BBCLONE_DIR."mark_page.php");
                      if (is_readable(COUNTER)) include_once(COUNTER);

                        以上ですが日本公式サイトの FAQ などに載せてもらえるとうれしいですが、まとめる場合は PHPに詳しい方が間違いなどを正してもっとわかりやすく書き直してくれることを希望します。 kiss