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は白紙をレンダリングした。