小野マトペの業務日誌(アニメ制作してない篇)

はてなダイアリーの閉鎖をうけ、旧ブログ http://d.hatena.ne.jp/ono_matope/ から移行しました。続きは→ http://matope.hatenablog.com/

Safari3のリロードは強制リロード


この一週間、Webページのブラウザキャッシュについて少し調べてた。
Webコンテンツを出来るだけブラウザキャッシュさせて転送量を削減しようと目論んでいて、PHPアプリケーション側でIf-Modified-SinceヘッダとDB最終更新時間を照らし合わせて、更新がなければ304を返す、という一般的なブラウザキャッシュ利用実装を行ったんだけど、テストしてみたらSafariが全然キャッシュを使ってくれない。と言うわけでApacheのログを取って色々調べた結果、表題のことが分かった。


Safariのリロードは、いわゆる強制リロード相当である


一応簡単に説明すると、IEなどの一般的なブラウザはページの読み込みシチュエーションによって、ブラウザ内のキャッシュを使うかどうかのポリシーを変化させている。IEやFxでは、

  • 通常ロード
    • ブックマークやロケーションバーからページにアクセスした場合
    • リンクや「戻る」によるページ遷移の場合
  • 通常リロード
    • リロードボタンやいわゆるF5ボタンによる再読込の場合
  • 強制リロード
    • ブラウザによって異なるがShift+F5やControl+F5などで、キャッシュを利用せずに強制的に再読込する場合

の三つの読み込みパターンがあるらしく、これらの種類によって、ブラウザはサーバーに対して主にCache-Control、If-None-Match、If-Modified-Sinceなどのキャッシュ利用ポリシー関係のヘッダを出し分け、キャッシュの使い方をサーバーに申告する。


で、その出し分け方がブラウザによって少しずつ違う。この辺りはhttp://blog.as-is.net/2007/02/modcache.htmlの記事が分かりやすいです。
このOgawaさんの作成された表に、自分が調査したSafariの振る舞いを勝手に追加させてもらった。

ヘッダ If-Modified-Since If-None-Match Cache-Control Pragma
Firefox 通常ロード
Firefox リロード max-age=0
Firefox 強制リロード no-cache no-cache
IE7 通常ロード
IE7 リロード
IE7 強制リロード no-cache no-cache
Safari 通常ロード
Safari リロード max-age=0
Safari 強制リロード


Safariに強制リロードインターフェイスは存在しないっぽいので空白。
このように、Safariにおけるリロードは、If-Modified-Since無し、If-None-Match無し、Cache-Controlはmax-age=0と、全方位スキ無しでブラウザキャッシュ利用を拒否していることが分かる。これはFx、IEにおける強制リロードと同等のレベルである。よって、Safariでリロードしたときに、ブラウザキャッシュを利用させることは出来ないと結論できる(通常ロード時には他のブラウザと同様にブラウザキャッシュが利用される)。ちなみに、If-*系ヘッダが無いのに強引に304 headerと空白のレスポンスを返したところ、Safariは白紙をレンダリングした。

補遺

ちなみに上記のSafariは3.2.1を用いたが、Safari 4 Public Beta(5528.17)では、リクエストしたページからリンクされている各種画像やcssファイルに関してはきちんとIf-Modified-Sinceヘッダを送信し、304レスポンスを受け入れるようになったようだ。いいことだと思う。