...pudding - diary

この日記は https://yapud.hatenablog.com/ に引っ越し中


2015-05-26

_ [Software] IE9 だけがキャッシュを使う

Webページの中で、画像ファイルを差し替えた。ファイルの日付やサイズが変わったので、レスポンスヘッダの Etag: や LastModified: などの値も変わった。

なのでブラウザはアクセス時に、手元にキャッシュがあってもキャッシュを使わずに、サーバから更新された画像を取得する。はず。

事実 FireFox や Chrome はそのような挙動をする。

なのに IE9 はローカルキャッシュを使ってしまう。どういうこと?

と思ったらIE9はオブジェクトをキャッシュしておく時間を計算する独自のアルゴリズムがあるようです。

Caching Improvements in Internet Explorer 9 - IEBlog - Site Home - MSDN Blogs


インターネットのプロパティでインターネット一時ファイルの確認方法を「自動的に確認する」にしている場合(すなわち初期値)オブジェクトの寿命を計算して決定するようです。

取得したときに max-age 等の指定が無い場合、RFC2616 に従いオブジェクトの寿命を ( 取得日時 - LastModified ) * 0.1 として扱うとのこと。

if the response does have a Last-Modified time, the heuristic
expiration value SHOULD be no more than some fraction of the interval
since that time. A typical setting of this fraction might be 10%.

日本語の情報だとコレか。

Internet Explorer 9 において Webサーバーとの通信なしでキャッシュからコンテンツを表示する場合がある

というわけで、サーバ側から Cache-control: no-cache もしくは max-age=0 を出すしかないと。

このようにキャッシュを使わない、とすると毎回全部を転送する通信が発生するのでリソースがもったいないし、キャッシュを使わせると自分で計算しようとするし、Web サーバ側でキャッシュさせないようなレスポンスヘッダを出すように設定を変えてしまうとそもそも予定通りに動いてる Firefox や Chrome にまで余計な通信を発生させるし、どうしたらええねん。

毎回更新時にファイル名変えるしかないか。


2015年
5月
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Twitter : @moriya_jp