Last-Modified を勉強して意気揚々としていたところ、更新されてもいない item が Fastladder でどうしても更新として現れてしまうという現象に気づきました。
以前、生成済みの静的な feed ファイルについては公開時に checksum なりダイジェストで確認して行うといいというような話を書きましたが、今回の feed は動的に生成し、request header に応じて redirect させるとか 304 Not Modified を返すとか、細かい制御を行いたいと考えていました。この現象は要するに 304 が返ってないんだなーと思い、とりあえず bot についてはいくつかヘッダの情報をログに落として確認してみました。
そこで発見。
Fastladder FeedFetcher/0.01 という bot はサーバの response した Last-Modified ではなく、最新 item の pubDate(last modified) の日時を If-Modified-Since で送ってきている。
それはどうなんだ。
そんなにいくつも調べてはいないのですが、少なくとも FeedBurner についてはサーバの返した Last-Modified をそのまま送ってよこします1。今回吐いていた feed は最新 item の日時と実際に feed を生成する時刻がずれており、つまり最新 item の日時と Last-Modified が合わないのは仕様です。ということは
Fastladder bot には必ず 200 が返ってしまう
のです。
やっぱ変だよなぁ、これ。と思って調べてみたところ、こんな記述を見つけました。
To get best results when sending an If-Modified-Since header field for cache validation, clients are advised to use the exact date string received in a previous Last-Modified header field whenever possible.
cf. RFC 2616 - Hypertext Transfer Protocol – HTTP/1.1
「ベストな結果を得るには、キャッシュの検証のために If-Modified-Since ヘッダを送る際には、クライアントは可能な限り前回リクエストで受け取った Last-Modified の文字列を正確に利用することが推奨される。」
わけですよ! やっぱそうだよね! なんで FeedFetcher は最新 item のタイムスタンプなんすか! Last-Modified を使ってくださいよ!
しかしじゃあなんで静的ファイルの場合は最新 item の時刻と食い違ってても更新として出てこないのかな? まだなんか秘密があるのかなぁ?
[追記] はてブに的確なツッコミ降臨。
kazuhooku 「推奨」であって義務じゃないよ。それに、RSSファイルが更新されたかというのと、フィードのアイテムの更新判定はまた別の話
いやまぁそうなんですけどね。もう一度整理すると疑問は2つあって、
- あえて違う値を使う意味あんのかなー?
- 例えば Last-Modified が返ってこない場合とかなら分かります。まーでもだったら If-Modified-Since にそれ付けてもたぶん意味ないよなーと思いますけど。
- なぜ今回の feed だけ更新判定ミスってるのかな?2
- これはこちらでもっと追求しないといけないと思います。
ということなんですよね。もしかして吐いてる HTTP date がまだ何かおかしいのかしら?(これがいちばんかっこ悪いパターン。)
個人的には今回の件以外にも更新判定ミスっててちょっと困ってる feed があるのですが、これも合わせて調べてみた方がいいかな。これは自分で提供してるものではないので、外から分かる範囲になっちゃうけど。
[2008-10-16 追記]
その後、誤検出については内容を増やした辺りからなくなったように思う。
んだけど、なんか今日気づいたけど If-Modified-Since に Last-Modified から 35分弱早い謎の時間を送ってくるようになっていた。これは予想していなかった。なんだろう、この微妙にずれた時間は。