IE6ではgzip圧縮されたJavaScriptが、実行されたりされなかったりする?

| コメント(1)

PSPカスタムテーマあぷろだを先日アップデートしたとき、それまでは「DBから取ってきたデータの一覧を、CGIの段階でHTMLに整形して出力」していたものを、「DBからデータを取ってきたCGIは、一覧をJavaScriptの連想配列として出力し、ブラウザの側でJavaScriptを使って整形・表示」するように変更しました。
そしたらIE6で見れなくなったという報告をいただきまして、手元にIE6の環境がなかったこともあって原因特定に手間取っておりました。やっと判明、解決(たぶん)。結論から言うと、犯人はどうもコレのよう。
HTML ページが表示されないか一部しか表示されない、またはネットワークの応答が停止する (KB823386)

どういうことかというと、HTTPレベルでの圧縮がかかってる場合、IE6はそのファイルを展開しそこねることがある、というバグです。なので、HTML中に
<script src="テーマの一覧.js"></script>
と書いてあっても、そのJSファイルが圧縮転送されてくると実行されないことがあった...というわけなのです。IE6はリクエストヘッダで「Accept-Encoding:gzip,deflate」って言ってる(「圧縮してあっても大丈夫だよ」という意味な)のに! 嘘つき!

というわけでとりあえずJavaScriptファイルの圧縮転送をやめてみたところ、IE6でも正常動作しているようです。

最初まったく見当がつかなくて、あれこれ試してるうちに、どうも「とあるHTTPプロトコルアナライザを使ってると問題が再現せず、アナライザをオフにするとたまに再現する」ことが判ってきまして。それがHTTP proxyタイプのアナライザだったため「プロキシを使うと再現しない」→「プロキシを使うと何が変わるのか?」→「Content-Encoding:くらいしか有意な違いがない」→「ちょっと待て、なんでJSファイルが圧縮転送されてるんだ?」というところまで来て、あれこれ実験してみたところ、このレンタルサーバの親切な機能に初めて気付いたのです。

このサーバ、もしかして、MIMEタイプが text/* だったら自動的にgzip圧縮で転送してくれたりする?

この記事の冒頭で書いたとおり、私はCGIでJavaScriptを出力しているのですが、そのMIMEタイプを「text/javascript」としていました。CGIからの出力であっても、サーバ側でちゃんとMIMEタイプを見て、text/* であれば圧縮をかけてくれてたんですね。今回はそれが仇になったと。
じゃあ普通のjsファイルはなぜ問題が出ないのかというと、このサーバではMIMEタイプは「application/x-javascript」になっていたからなのです。なので圧縮されないから無問題。なるほど...。

しかしJavaScriptのMIMEタイプって何が正しいんでしょう…W3CのHTMLの仕様では <script type="text/javascript"> という書き方をしていた気がするけど?
と思って調べてたら、なんと衝撃の事実が発覚!
去年(2006年4月)に出たRFC 4329(Scripting Media Types)によって「text/javascript」はobsoleteとなってるじゃないですか! 知らなかった...。
代わりに「application/javascript」が登録されていました。これはこれで対応してないブラウザも少なからずありそうですが。

というわけで大体わかってきたんですが、でもGoogle AnalyticsのJSファイルとかは、Googleのサーバからgzip圧縮で送られてくるんですよね。「gzip圧縮してあってもIE6で取りこぼさせない方法」とかありそうです。面倒だからもうこれ以上調べないけど。

コメント(1)

あの、カスタムテーマのことじゃないんですけど、ロコロコあぷろだって、どうやって、ダウンロードすればいいのでしょうか。なんかやってもダメ(破損(?)データ)になってしまうので、良ければ教えてください、お願いします。

このブログ記事について

このページは、水の森が2007年11月29日 16:35に書いたブログ記事です。

ひとつ前のブログ記事は「PSPカスタムテーマあぷろだ:11/15アップデート内容」です。

次のブログ記事は「勇者のくせになまいきだ。あぷろだ検討中」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。