If-Modified-Since/Last-Modifiedのペアの取り扱いは割かし楽だった。Studying HTTPの解説と、若干のPHP関数のマニュアル見るだけでどうにかできた。(filemtime関数は盲点だった・・・。fstatしてたよ、畜生。)
で、まあ基本はこれで行けそうなんだけど、ずっと前にキャッシュ周りで調べてたときにちらっと気になった "Etag" というヘッダフィールドについて調べてみた。
実はこれ、Studying HTTP には載っていない。では非標準ヘッダーか?と調べてみたら、
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
にあるように、RFC2616で規定されている。
で、ざっとぐぐってみたところ。まずは@ITにヒット。
まあ上記は、画像やstatic-HTML, CSS, JavaScriptなどがメインの話になってくるのでしょう。Apacheだと"FileEtag"というので、どの情報を基にEtagを生成するのかを指定できるみたい。Apache本家のマニュアルはこちら。
http://httpd.apache.org/docs/2.2/ja/mod/core.html
@ITの記事では、逆にFileEtagを画像などでも無効化する対策が載ってるけど、
http://dsas.blog.klab.org/archives/50602499.html
では単にMtimeとSizeだけを元に生成するよう調整している。確かに、静的ファイルは自らLast-Modified吐いたりするわけじゃないので、FileEtagがあるに越したことはない。
CVSとか使ったり、最悪、mtimeならtouchコマンドで偽造できる。Sizeはコピーしたなら一緒だろう。なので、FileMatchで静的ファイルにのみ自動でEtagを付けるようにするのは、割かし効果的な気がする。