-
☆ A M B ☆
- 1,231 Posts
それは条件付きGETですね。MODxもWordPressも200を返すので、たぶん違う理由だと思います。
-
☆ A M B ☆
- 1,231 Posts
Last-Modifiedというのはhttpヘッダーといって、コアが出力する領域です。
コアファイル対象にheaderでGrepしてみるとヒントが得られると思います。(header関数を使っているので)
たしかにMODxはそのへんのチューニングが大雑把な感じですね。
優先度やや低めになりますが、見ておきます。
コアファイル対象に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 も出力すること。
これが記事の更新を判断するためにはかなり重要らしい。
-
☆ A M B ☆
- 1,231 Posts
httpヘッダーはスニペットでは出力できないですよ。なのでプラグインですね。
他のCMSのように無条件で最新日時を出力+200 OK出力でよければコア改良ということでいいかな?と思いますが、正確な出力を狙うものなら、作りかけのプラグインありますよ。作りかけというか、ほぼ完成してるはずだけどまだあまり検証してないので・・
ちなみにetagは無視されてることが多いみたいです。
-
☆ A M B ☆
- 1,231 Posts
あ、えーーと・・・CMSの開発者がという意味ではなくて、クライアント側がetagを無視することが多いということです。
でもこれ、検証がけっこう厄介ですよ。tkfmさんも指摘されてますが、何をもって最新とするかは運用によっても違いますし。