とある拙作システムをご利用中のお客様より「投入したデータがIE9だと表示反映されない。IE7だと正常。」というような報告をうけました。「IE6/7だとおかしい」とか「IE6〜9全部おかしい」とかはよくあるけど、IE9だけ異常で古いIEだと大丈夫というパターンは初めて。
症状を確認すると、反映されないと言われたデータは自分の環境からは異常なく見えたので、当初は先方の勘違いかなと思ったんだけど、複数環境で異常が確認されたと言うことなので、ちゃんと調べてみた。こういうケースでまず疑うのは、ブラウザのキャッシュですね。…ということで的中でした。キャッシュを削除してもらったところ、表示されていなかったデータが表示されるようになったとのこと。
ググったところ、どうやらこれが原因のようです。
Internet Explorer 9 はRFC2616に準拠し、以前のバージョンに比べて積極的にキャッシュを利用し、パフォーマンスの向上を図るようになりました。今回の現象は、明示的にキャッシュの有効期限が指定されておらず、かつ Internet Explorer 9で「インターネット一時ファイルと履歴の設定」を「自動的に確認する」にしている場合に該当します。この条件の場合でも、以前のバージョンではWebサーバーと通信を行って更新を確認していましたが、Internet Explorer 9では Web サーバーと通信せずにコンテンツをキャッシュから取得して表示する場合があります。
Microsoftサポート/Internet Explorer 9 において Webサーバーとの通信なしでキャッシュからコンテンツを表示する場合がある
今まで散々規格外のオレオレ仕様を展開してきたIEが、今度はRFC準拠を免罪符にデファクトスタンダードから外れることをやり始めたか。
IE9で正しく更新を検出してほしい場合、サーバーサイドで動的に返すコンテンツであればHTTPヘッダにCache-Control: no-cacheなどを付けてレスポンス送出してキャッシュを禁止することで、この問題を回避することができます。
静的なHTMLファイルであれば、meta要素でCache-Controlを入れればokです。しかし静的なHTMLから呼ばれるCSSやjsなどでは、Webサーバの設定(.htaccessなど)でCache-Controlを強制挿入するしかないですかね。
それにしてもこういう多方面に影響が及ぶ協調性のない仕様変更は勘弁してほしいところですが、そもそも今までキャッシュ制御を明示していなかった我々も怠慢だったのかもしれません。
いずれにしてもこの挙動だと、古いWebアプリなどで不具合が出るケースがあるんじゃないかと思います。利用者サイドとしては「インターネット一時ファイル」の「保存しているページの新しいバージョンがあるかどうかの確認」の設定を、デフォルトの「自動的に確認する」から「Webサイトを表示するたびに確認する」に変更しておいたほうが、無用なトラブルを避けるためには無難なのではないかと思います。
開発者サイドとしては、今後はキャッシュ制御に対して今まで以上に意識して慎重に実装する必要があります。
IEって、推奨「50-250MB」っていっておきながら、デフォルトで1024MBな設定になっているのね。
デフォルト設定の1024MBなんて古いキャッシュがたまりすぎる感じだけなので、(インデックスが多くなれば検索時間も、2を底にとった指数関数オーダに比例するぐらいに処理時間が増えるので)放っておくとパフォーマンスが悪くなってくるだけよ。