ただのにっき
2007-01-08(月) [長年日記]
■ ETagとLast-Modifiedはどっちが優先されるべきなんだ
FirefoxでtDiaryを閲覧するときに、html_anchorプラグインと(Apacheの)Actionのあわせ技で空白ページが返ることがあり、ETagを返すことで直るということを高木さんが発見したとのこと。
tDiaryは、リンク元が加わったりサイドバーの内容が変わったくらいではLast-Modifiedを変更しないので、ブラウザのリロードでは内容が変わらない。このためno-cache系のヘッダを追加して、常にコンテンツをGETさせるようにしているのだが、Firefoxではこのへんが悪さをしている(らしい)。適当なETagを返してやればそれが解消されるということだろう。
この件についてまちゅさんがいろいろやってくれているが、よくわからんので、とりあえずtDiary 2.1系でETagを吐くようにした。Apacheが「304 Not Modified」を返してくれないなら、CGIスクリプトが自分で判断して304を返せばいいだけだし。しかしHTTPのこのあたり、キャッシュ制御まわりの仕様は、条件が複雑でわけわからんなー。今度「HTTPはシンプルなプロトコルで〜」とか言うヤツがいたら首を絞めてやる。
で、いろいろテストしてみたんだけど、IE6は、ETagとIf-None-Matchが不一致だからと「200 OK」を返しても、Last-Modifiedが変わらなければ表示内容を変化させないような。なんだかなぁ。ちゃんとETagの値を変えた上でコンテンツ全部返してるんだから、それ使ってくれればいいじゃん。ケチ。
(もしかするとIf-Modified-Sinceにも対応するともっとマシになるのかも知れないけど、今回はパス)
そう言えば、If-None-Matchの値がcgi.rb経由で取れるかと思ったら、取れなかった。[ruby-core 6906]で1年前に提案されているけど1.9行きか。まぁ、非互換出されても悩ましいだけなのでこれでいいか。