IE6で時々ページが真っ白になるバグの対処法

おそらく既知のバグだと思うけど記録。

こちらにあるようなIE6の文字コード認識のトラブルとは別件で、主に動的にPageを生成している場合に起こる話。

下記4つの条件、

  1. IE6でAタグのリンクをクリックしてページを開く
  2. HTTP ResponseがGZIP圧縮転送される
  3. HTTP Response Headerに "Cache-Control: no-cache"
    または "Cache-Control: no-store" の片方、或いは両方が含まれている
  4. Response内容が3.5KB前後よりも小さい

これらが全て揃った場合に、1〜20回に1回の割合で「ページ真っ白現象」が再現する(なんでランダムに発生するんだかが判らん…)。ただしクライアントの環境によっては再現しない場合もあるかも。私の環境WindowsXP SP2+IE6 SP2及びスタンドアロン版IE6では再現します。

言語を問わず対策が必要なバグだと思いますが、特にPHPでSESSIONを使ってる方は要注意。session_start() は自動的に "Cache-Control: no-cache, no-store" を含むヘッダをいくつか吐き出します。きちんと対策をしておかないと、IE6ユーザーから見たあなたのWebサイトは時々真っ白け…かもしれません。

バグの特徴

  • 真っ白になったらソースの表示ができない
  • 真っ白になってもリロードすれば直る
  • リロードし続けても再現しない
  • URLを直接入力した場合も再現しない
  • IE6以外のブラウザでは再現しない(IE6を利用するSleipnirなどでは再現する)

再現実験

IE6でこちらへどうぞ。運が良い方は、いきなり真っ白かもしれませんが、その場合はリロードしてください。

対処方法

  1. Cache-Control: no-cache, no-store を使わない
    PHPでsession_start()を使っている場合でも
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    で上書けばOK
  2. HTTP Response Headerに文字コード指定を含める
    例:UTF-8の場合 Content-Type: text/html; charset=UTF-8
  3. Response内容を4KB前後よりも大きくする
  4. その他

以上。

いやぁ、なんだかえらく苦労したなぁ…。