電気ウナギ的○○

About Home

FFもIEも、何故にそれほど頑なにキャッシュを読みにいくのか!?

shinoda (2011年1月31日 19:06)

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

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

いやあ、でも、これってダミーの文字列を含んだキャッシュがローカルにどんどん作られていくので、あんま好きではないんだよな、こういうやり方。
で、何とかならんかと、色々リクエストヘッダを追加してみたり、サーバ側でラッパー CGI カマしてみたりしたんだけど・・・駄目だった(^^;無駄な時間をすごしただけだった(^^;

なんなの、もう!(怒)

ほんま、更新日付だけはちゃんとチェックしてくれよ。その上で「更新日付が古ければ」キャッシュを使ってくれよ。それって、ブラウザの最低限の仕事じゃねえのかよ!?>Firefox, InternetExplorer

電気ウナギ的○○

電気ウナギ的○○

About Back

コメント(0)

電気ウナギ的○○

電気ウナギ的○○

About Back

トラックバック(0)

トラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/1461

電気ウナギ的○○

About This Site

電気ウナギ的○○
岩国在住。広島で働く超零細IT企業社長のいわゆる社長日記。
何か、酒と食い物のことばかり書いているようで・・・お察しのとおり、肥満体です:-)


2011/06/24
iPhone用サイト公開

Create with jQuery, jQTouch.


CLOSE