キャッシュコントロール

個人的メモ。

PHP 等のサーバ側プログラムでキャッシュコントロールを行う場合、以下のような流れになります。

リクエストヘッダ If-Modified-Since を受け取る
データの更新時間を取得し If-Modified-Since と比較
更新されていれば以下のヘッダを送信
HTTP/1.1 200 OK
Last-Modified: 最終更新時間
ETag: "任意の文字列"
Cache-Control: private
更新されていなければ以下のヘッダを送信後即終了
HTTP/1.1 304 Not Modified
Last-Modified: 最終更新時間
ETag: "任意の文字列"
Cache-Control: private
モジュール版PHPで「If-Modified-Since」に対応するにコード付きの詳しい説明がありますので、参考にさせて頂きましょう。あとリクエストメソッドが HEAD の時は更新されていても実際のデータは送信しないようにしておけば OK ですかね。こちらの@IT記事も参考に。一応RFCにもリンクを張っておきますので、より詳しく調べたい人はどうぞ RFC2616 HTTP/1.1 Header Field Definitions

で、304 の場合はブラウザ側にキャッシュされているデータが再利用される訳ですが、これを強制的にリロードさせたい時はどうするのか?いわゆるスーパーリロードってヤツですが、これを最近の主流となっている3つのブラウザについて検証してみました。

  • Internet Exploror 6
    コントロールキーを押しながら更新ボタンでページ全体がリロードされる(If-Modified-Since 等を送信しない)
  • Firefox 1.0.1
    シフトキーを押しながら更新ボタンでページ全体がリロードされる(If-Modified-Since 等を送信しない)。
  • Opera 7.53
    更新ボタンのみでページ単体(HTMLファイルのみとか)がリロードされる。ページ内にある画像もリロードさせたい場合は、その画像のみを表示させておいてから更新ボタンを押す。

全て Windows2000 で検証してます。こう見ると Opera の挙動がちょっと特殊に見えますね。もしかしたらバグなのかも…。ブラウザの戻るボタンで戻った時、IE なら再読み込みが発生してしまうページでも Opera だとキャッシュを表示したりします。Opera はキャッシュに対しては他のブラウザとは違うポリシーを持って作られているんですかね。