We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 6350
    • 421 Posts
    modx でサイト作成後 Baidu の bot の訪問とアクセス時間が異常に長いのに気づいていたのですが今まで原因がわかりませんでした。

    サイトの完成後 baidu からのアクセスが10分置きくらいですが70時間以上続く日が一ヶ月以上続きました。
    Google からのアクセスも割と長い時間続いていたようです。

    4ヶ月を過ぎた今でも WordPress で作成したサイトに比べると更新が少ない割りに Baidu、Google のアクセスはかなり多いほうです。lolipop のブログが baidu からのアクセスを禁止している理由もわかったような気はするのですが・・・

    以下のような記事を見つけてひょっとしたらと思ったのですが 304 レスポンスコードは関係するのでしょうか。
    http://linux.enegai.jp/modx/wp_blog.html?p=395

    RSS の出力するコードを見比べても WordPress と modx の差がよくわかりません。
    また、If-Modified とは・・・検索しても設定方法に言及したページを見つけることもできません :’(
      • 33014 ☆ A M B ☆
      • 1,231 Posts
      それは条件付きGETですね。MODxもWordPressも200を返すので、たぶん違う理由だと思います。
        • 6350
        • 421 Posts
        WordPress と modx の HTTP Response Header を見比べてみました。

        どちらも HTTP Status Code: HTTP/1.1 200 OK となっているようですが WordPress では Last-Modified: というフィールドがあるようです。
        同じく joomla のRSS でも Last-Modified: を出力しているようです。

        [table]
        [tr][td]Name[/td][td]value[/td][/tr]
        [tr][td]Last-Modified: [/td][td]Sat, 07 Mar 2009 08:29:31 GMT[/td][/tr]
        [/table]

        このあたりで違いが出てくるのでしょうか。
        bbclone を使ってモニタしていたその当時、実際にmodx では同じ記事を数分おきに何度も繰り返しアクセスされていました。
        RSS で Last-Modified を出力していないのは modx だけのようです。
        http://web-sniffer.net/ で調べてみました。 huh
          • 6350
          • 421 Posts
          yama さんはちょこっとだけ口を出してすぐにいなくなる。

          仕方がないので自分で調べてみた << 最初からそうしろ僕
          ditto/format の中に入っているテンプレートを調べてみると最終更新日が指定されているのは atom.format.inc.php だけのようだ。それを参考に rss.format.inc.php にプレースフォルダを追加してみた。

          $rss_placeholders[’rss_lastmodified’] = date(’r’, $modx->documentObject["editedon"]);
          でプレースフォルダへ登録。’r’ の日付フォーマットは RFC2833 て定義されているらしい。

          それを以下のテンプレート部分へ追加
          $rss_header = <<<TPL
          <?xml version="1.0" encoding="[+rss_charset+]" ?>
          [+rss_xsl+]
          <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
          <channel>
          <title>[*pagetitle*]</title>
          <link>[+rss_link+]</link>
          <description>[*description*]</description>
          <pubDate>[+rss_lastmodified+]</pubDate>
          <language>[+rss_lang+]</language>
          <copyright>[+rss_copyright+]</copyright>
          <ttl>[+rss_ttl+]</ttl>
          TPL;
          それを http://web-sniffer.net/ で出力を調べてみる。んが Last-Modified: が出力されない。RSS の出力ソースコードにはちゃんと日付が入ってるのに~。

          ちなみに、atom の出力も追加して調べてみたがこちらも Last-Modified: が出力されない~
            <link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="[(site_url)][~11~]" />
            <link rel="alternate" type="application/atom+xml" title="Atom 0.3" href="[(site_url)][~110~]" />
          

          何のための [+atom_lastmodified+] なんだ~
          yama さん、逃げた罰として日本語版 modx では atom だけでも最終更新日が出るように検討してください。 laugh


          参考文献

          RSSのフォーマット・仕様・構造 http://memorva.jp/memo/api/rss.php
          PHP: date - Manual http://jp2.php.net/date
            • 33014 ☆ A M B ☆
            • 1,231 Posts
            Last-Modifiedというのはhttpヘッダーといって、コアが出力する領域です。
            コアファイル対象にheaderでGrepしてみるとヒントが得られると思います。(header関数を使っているので)
            たしかにMODxはそのへんのチューニングが大雑把な感じですね。
            優先度やや低めになりますが、見ておきます。
              • 6350
              • 421 Posts
              コアファイル対象にheaderでGrepしてみると ・・・

              705 個が検索されました。それでどうしろと (T_T) そういえば bbclone のときもそうだった。おかげで4日もかかったのですが。
              さいしょから Last-Modified で検索したほうが早い。たぶん

              connector.php 188行目がそれっぽい、だか違う。
              header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

              rss_fetch.inc 162行目あたりが本命か?ここではやはり更新日よりも ETag の方が重要。
              だがRSS 出力ではここは呼ばれていない。

              manager/index.php 63行目にもある、これが一番参考になる。
              header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

              これを modx/index.php 59行目の前に入れてみる
              header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
              header(’P3P: CP="NOI NID ADMa OUR IND UNI COM NAV"’); // header for weird cookie stuff. Blame IE.
              header(’Cache-Control: private, must-revalidate’);

              だがこれではだめだ。常に最新時刻が表示されてしまう。およびトップページのみ Last-Modified: を出力しなければいけないので manager/index.php の真似事ではいけないようだ。

              さらに
              date(’r’, $modx->documentObject["editedon"]);ではなく
              gmdate(’r’, $modx->documentObject["editedon"]);を使用する必要がある。
              $modx->documentObject["editedon"] なのでコアがイニシャライズされていないと呼べないのでこまった。

              ここまで、言ってることが理解できた人は偉い。言ってる本人がわかってないのだから (^。^)y-.。o○

              まとめ(中間報告)

              (1)一番簡単なのは次のレスポンスヘッダー文をスニペットにしトップページと RSS出力の場合のみ呼び出す方法だ。
              header("Last-Modified: " . gmdate(’r’, $modx->documentObject["editedon"]) . " GMT");

                 もしくはプラグインにしてシステムイベントの OnWebPagePrerender で呼び出すのが一番簡単かな。
                 テンプレートに左右されないので・・もっといい場所はあるはずですが

                 本当は rss_fetch.inc をどっかから呼び出すのが正道?

              (2)さらに rss_header テンプレート内では各記事の日時もローカルタイムで出力されている。
                 これも GMT 時刻にしたほうがよさそう。

              (3)一番重要な部分は RSS出力 からは ETag も出力すること。
                 これが記事の更新を判断するためにはかなり重要らしい。
                • 33014 ☆ A M B ☆
                • 1,231 Posts
                httpヘッダーはスニペットでは出力できないですよ。なのでプラグインですね。

                他のCMSのように無条件で最新日時を出力+200 OK出力でよければコア改良ということでいいかな?と思いますが、正確な出力を狙うものなら、作りかけのプラグインありますよ。作りかけというか、ほぼ完成してるはずだけどまだあまり検証してないので・・
                ちなみにetagは無視されてることが多いみたいです。
                  • 36592
                  • 970 Posts
                  Quote from: dainiti at Mar 09, 2009, 12:32 AM

                  (1)一番簡単なのは次のレスポンスヘッダー文をスニペットにしトップページと RSS出力の場合のみ呼び出す方法だ。
                  header("Last-Modified: " . gmdate(’r’, $modx->documentObject["editedon"]) . " GMT");
                  これだと、RSSのドキュメント自身が編集されないと、値が変化しないのでは?
                  RSS出力対象になっているドキュメントを全部サーチして、
                  その中でeditedonが一番新しい(大きい)値を探してこないといけないような気がします。

                  過去にも語られていますが、結局ページ毎に何の値をもって更新されたと判断するかが難しい...のでは?
                  (RSSの場合は上記のような感じでしょうが、それ以外のページではまた違うのかも?)
                  http://modxcms.com/forums/index.php?topic=4569.0
                    • 6350
                    • 421 Posts
                    Quote from: yama at Mar 09, 2009, 12:41 AM

                    httpヘッダーはスニペットでは出力できないですよ。なのでプラグインですね。
                    ・・・
                    ちなみにetagは無視されてることが多いみたいです。
                    たとえば WordPress 2.7 の classes.php 内 function send_headers()でもちゃんと 304 も ETag処理も入っています。
                    modx の rss_fetch.inc の function fetch_rss ($url)内でもやはり 304 も ETagもきっちり入っています。

                    だから僕としては無条件で+200ではなく、将来の日本語版 modx では fetch_rss を呼び出してくれることを期待します。ETag サポートで (^。^)y-.。o○

                    だけど、つくりかけのプラグイン ・・ ください laugh
                      • 33014 ☆ A M B ☆
                      • 1,231 Posts
                      あ、えーーと・・・CMSの開発者がという意味ではなくて、クライアント側がetagを無視することが多いということです。
                      でもこれ、検証がけっこう厄介ですよ。tkfmさんも指摘されてますが、何をもって最新とするかは運用によっても違いますし。