ブラウザキャッシュとレスポンスヘッダ
ブラウザキャッシュとレスポンスヘッダの関係を調べてみた。
調べたブラウザ
- Firefox 3.5
- IE 6
- Opera 9.64
- Google Chrome 2.0.172.33
レスポンスヘッダ
- 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 | × | × | × | × | △ | △ | △ | △ |
ただし、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 | × | × | × | × | △ | △ | △ | △ |