FFもIEも、何故にそれほど頑なにキャッシュを読みにいくのか!?[インターネットなこと]
(2011-01-31 19:06:55) by shinoda


< ページ移動: 1 2 >

いやあ、今日も数時間を無駄にすごしてしまった。この糞忙しいのに・・・である。

今日引っかかってたのは「キャッシュ」の問題。
まあ、Web システムを開発している人は、何度かハマったことがあるんじゃなかろうか?
「ソースを直したのに相変わらず表示が変だなぁ。直し方が悪いんかなあ?」って思ってたら、単にブラウザが古い画面をキャッシュしてただけだった・・・っていうアレである。

本当にがっくりくるよな、あれは。
しかも、Firefox と InternetExplorer でキャッシュする条件が違ってたりして。
そもそも、更新日付が変わってたらキャッシュなんか見ちゃ駄目だろう?なのに、FFにしてもIEにしても、何か積極的に・・・つーか、サーバ上のコンテンツが更新されてるかどうかなんてろくすっぽ確認もせずにキャッシュ見にいくよな。鬱陶しい。
今時のブラウザは If-Modified-Since って聞かないの?

もう、インターネットの基盤だって整備が進み、回線速度だって上がってる今日この頃。「キャッシュするのが基本」って設計思想がもう間違ってないか?
つーかさあ、少なくとも If-Modified-Since は投げようよ。

実際のところ、最近のIEなんかは、どうしてもキャッシュさせたくない時は、「URL を変えてしまう」しか方法がないのだ。

例えば、不定期に更新される設定ファイルを FLASH 内から読みたい時。
設定ファイルの URL が http://exsample.com/hogehoge.txt だったとする。

ActionScript 3 で、

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.TEXT;
var header:URLRequestHeader = new URLRequestHeader("pragma", "no-cache");

loader.addEventListener(Event.COMPLETE, completeReadUrlList);
loader.addEventListener(IOErrorEvent.IO_ERROR, onIOErrorReadUrlList);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityErrorReadUrlList);

var req:URLRequest = new URLRequest("http://exsample.com/hogehoge.txt");
req.requestHeaders.push(header);

loader.load(req);

なんて書いて、この処理を Timer で一定時間毎に実行したとしても、IE では「FLASH をリロードするまで hogehoge.txt の再読込はしない」し、Firefox ではもっと酷くて「ページキャッシュを消去してからリロードするまで再読込はしない」のだ。マジ、意味わかんねえ、酷い話だ。hogehoge.txt の更新日時は当然変わっているのに・・・だぞ。(^^;
ローカルキャッシュがあったら、If-Modified-Since を含んだ http リクエストすら投げてないってことか?

しょうがないので、こういう時は、

var req:URLRequest = new URLRequest("http://exsample.com/hogehoge.txt?a=" + (new Date).time);

みたいに URL のケツにエポックタイムとか、そういうユニークな数字等をつけて、「こいつはキャッシュされてる URL じゃないよお」とブラウザを「欺す」しかないのである。

ActionScript 3 のエポックタイムはミリ秒単位なので、例えば上記の例だと、

http://exsample.com/hogehoge.txt?a=1296452293572

みたいな URL になるね。10秒後に同じ処理をおこなうと、今度は

http://exsample.com/hogehoge.txt?a=1296452303572

という URL になる。数字のところが変わってくるので、これは別のページと判断され、ブラウザはキャッシュを使わないのだ。ちなみに、? 以降の文字列はサーバ上の環境変数としてセットされるが、テキストファイルのような固定コンテンツでは無視されるだけである。なので問題無し。

いやあ、でも、これってダミーの文字列を含んだキャッシュがローカルにどんどん作られていくので、あんま好きではないんだよな、こういうやり方。

< ページ移動: 1 2 >


コメント投稿
次の記事へ >
< 前の記事へ
TOPへ戻る

Powered by
MT4i 3.0.8