ブラウザキャッシュとレスポンスヘッダ

ブラウザキャッシュとレスポンスヘッダの関係を調べてみた。

調べたブラウザ

レスポンスヘッダ

  • Expires
  • Last-Modified
  • Cache-Control
  • Pragma

結論

以下のレスポンスヘッダを返す。
Expires、Last-Modified、Cache-Control、Pragma 以外のヘッダについては任意。

キャッシュさせたい場合
Cache-Control: private, max-age=有効期間の秒数
条件付GETをさせたい場合
Expires: 過去の時刻
Last-Modified: 過去の時刻
キャッシュさせたくない場合
Cache-Control: no-cache

調査方法

それぞれのブラウザで以下のレスポンスヘッダを返すページを読み込んだときに、2回目以降のアクセスがどう変化するか調べてみた。

レスポンスヘッダの種類は以下のとおり。

  • Expires
    • なし
    • 過去の時刻
    • 現在時刻
    • 未来の時刻
  • Last-Modified
    • なし
    • あり (過去の時刻)
  • Cache-Control
    • private
    • private, max-age
    • no-cache
    • no-cache, max-age
  • Pragma
    • なし
    • no-cache

調査結果

結果の表記

リクエストが発生しなかった。(キャッシュを使用した)
条件付GETリクエストが発生した。(If-Modified-Since ヘッダ付きのリクエストになった)
×
リクエストが発生した。(通常通りのリクエストになった)
Firefox 3.5











Last-Modified
なし
Last-Modified
あり
Expires
なし
Expires
過去
Expires
現在
Expires
未来
Expires
なし
Expires
過去
Expires
現在
Expires
未来
Pragma
なし
Cache-Control
なし
×××
Cache-Control
private
×××
Cache-Control
private, max-age
Cache-Control
no-cache
××××
Cache-Control
no-cache, max-age
××××
Pragma
no-cache
Cache-Control
なし
××××
Cache-Control
private
××××
Cache-Control
private, max-age
××××
Cache-Control
no-cache
××××
Cache-Control
no-cache, max-age
××××

no-cacheヘッダをつけると毎回ページを読みにいってくれるようだ。
その代わり、極力条件付GETにしてくれる。(no-cacheをつけても条件付GETするのはどうかと思うが)
また、FirefoxはLast-Modifiedを使ってキャッシュの有効期間を計算し、
有効期間中はリクエストを送信しないそうな。*1
その計算式は (キャッシュ日時-最終更新日時)÷10 らしい。

IE 6.0











Last-Modified
なし
Last-Modified
あり
Expires
なし
Expires
過去
Expires
現在
Expires
未来
Expires
なし
Expires
過去
Expires
現在
Expires
未来
Pragma
なし
Cache-Control
なし
×
Cache-Control
private
×
Cache-Control
private, max-age
Cache-Control
no-cache
××××××××
Cache-Control
no-cache, max-age
××××××××
Pragma
no-cache
Cache-Control
なし
×
Cache-Control
private
×
Cache-Control
private, max-age
Cache-Control
no-cache
××××××××
Cache-Control
no-cache, max-age
××××××××

かなり積極的にキャッシュを使っている。
Pragma?なにそれおいしいの状態。
その代わり、Cache-Control: no-cacheではまったくキャッシュを使わない。
また、Last-Modifiedの値がキャッシュと同じであれば、
レスポンスが "304 Not Modified" でなくともキャッシュを使ってしまうらしい。*2

Opera 9.64











Last-Modified
なし
Last-Modified
あり
Expires
なし
Expires
過去
Expires
現在
Expires
未来
Expires
なし
Expires
過去
Expires
現在
Expires
未来
Pragma
なし
Cache-Control
なし
××
Cache-Control
private
××
Cache-Control
private, max-age
Cache-Control
no-cache
××××
Cache-Control
no-cache, max-age
××××
Pragma
no-cache
Cache-Control
なし
××××
Cache-Control
private
××××
Cache-Control
private, max-age
××××
Cache-Control
no-cache
××××
Cache-Control
no-cache, max-age
××××
概ねFirefoxと同じ挙動をとる。
ただし、Expiresに現在時刻を指定した場合に、Firefoxではリクエストを送信するが、
Operaではキャッシュを使う。

Google Chrome 2.0.172.33











Last-Modified
なし
Last-Modified
あり
Expires
なし
Expires
過去
Expires
現在
Expires
未来
Expires
なし
Expires
過去
Expires
現在
Expires
未来
Pragma
なし
Cache-Control
なし
×××
Cache-Control
private
×××
Cache-Control
private, max-age
Cache-Control
no-cache
××××
Cache-Control
no-cache, max-age
××××
Pragma
no-cache
Cache-Control
なし
××××
Cache-Control
private
××××
Cache-Control
private, max-age
××××
Cache-Control
no-cache
××××
Cache-Control
no-cache, max-age
××××
Firefoxと同じ挙動をとる。