If-Modified-Since/Last-Modifiedのペアの取り扱いは割かし楽だった。Studying HTTPの解説と、若干のPHP関数のマニュアル見るだけでどうにかできた。(filemtime関数は盲点だった・・・。fstatしてたよ、畜生。) で、まあ基本はこれで行けそうなんだけど、ずっと前にキャッシュ周りで調べてたときにちらっと気になった "Etag" というヘッダフィールドについて調べてみた。 実はこれ、Studying HTTP には載っていない。では非標準ヘッダーか?と調べてみたら、 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html にあるように、RFC2616で規定されている。 で、ざっとぐぐってみたところ。まずは@ITにヒット。 - http://www.atmarkit.co.jp/fjava/rensai2/webopt12/webopt12.html -- ApacheのデフォルトのEtagだと、ファイルのi-nodeを使用している為、分散環境ではばらばらのEtagが返されてしまい、キャッシュ効果が無かったという話。 - http://dsas.blog.klab.org/archives/50602499.html -- とかでも同様の話が出てた。i-nodeはまずいので、サイズや最終更新日を使え、とか。 まあ上記は、画像や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を付けるようにするのは、割かし効果的な気がする。