IE 9 標準モードでは text/css のみがスタイルシートとして有効

本記事は、マイクロソフト本社の IE チームのブログ から記事を抜粋し、翻訳したものです。 

【元記事】IE9 Standards Mode Accepts only textcss for stylesheets (2011/3/28 1:39 AM)

 

先日、以下のように IE 9 では適切に表示されないブログを目にしました。

image

このブログ サイトは、他のブラウザーを使ったり、アドレス バーのアイコンをクリックして互換表示にした場合には、以下のように適切に表示されます。

image

IE 9 では何が起きているのでしょうか。明らかにスタイルシートが適用されていませんが、なぜでしょうか。

F12 キーで起動される、IE 9 開発者ツールの [コンソール] タブには、サーバーがスタイルシート応答として適切でない MIME タイプを指定している場合に通知が記録されます。ただし、スタイルシートのダウンロードが失敗した場合、[コンソール] には明示的な通知は記録されません。ダウンロードの失敗の原因を究明するには、開発者ツールの [ネットワーク] タブ、または Fiddler を使用する必要があります。

このサイトの問題の根本は、Fiddler を使ってトラフィックを確認すればすぐに明らかになります。IE 9 が標準モードで実行されていると、このサイトは、重要なスタイルシートに対して HTTP/406 のエラーを返します。

image

スタイルシートのダウンロードが失敗すると (上の図の赤字エントリを参照)、IE が適用できるスタイルがなくなり、スタイル設定なしの HTML が表示されます。

IE 9 の標準モードでは何が異なるのでしょうか。

旧バージョンの IE では、ページ内のすべてのリソースについて "Accept: */* " という要求ヘッダーが不適切に送信されていましたが、IE 9 の標準モードではこの長年にわたる制限がなくなりました。このヘッダーは、サーバーからどのようなコンテンツ タイプが返されても IE は完璧に処理できるという誤った内容を伝えていました。

これまでも常に間違いだったということですが、すべてを受け入れるという指定は IE 9 では明らかに間違いです。これは、セキュリティおよび標準の観点から当然です。IE 9 の標準モードでは、スタイルシート応答は MIME タイプ text/css である必要があります。text/css でない場合、IE 9 は応答をスタイルシートとして読み込もうとしません。IE 9 はこの要件をサーバーに伝えるため、スタイルシートの HTTP 要求を行うときに text/css 応答のみを受け入れることを明示します。

このサイトのサーバーにはバグがあることがわかりました。このサーバーは、ブラウザーが txt/css 応答のみを受け入れると明示する場合、応答コンテンツが実際に text/css であっても、"HTTP/406 Not Acceptable" 応答を返します。HTTP/406 応答の応答ヘッダーを見れば、問題解決へのヒントが得られます。

 HTTP/1.1 406 Not Acceptable 
Server: Apache 
Alternates: {"serendipity.css.php" 1 {type application/x-httpd-php}} 
Vary: negotiate,Accept-Encoding 
TCN: list
Content-Type: text/html; charset=iso-8859-1

Alternates ヘッダーを見ると、問題の CSS ファイルは PHP によって生成されることがわかりますが、Web サーバー ソフトウェアは PHP ファイルの MIME タイプ は必ず "application/x-httpd-php" であると想定しています。この想定のため、Web サーバーは PHP ファイルの実行を拒否することになり、PHP ファイルが適切な text/css MIME タイプを設定することができなくなります。

Firefox、Chrome、Opera のいずれの Accept ヘッダーも、スタイルシート応答についてすべての MIME タイプを受け入れることを示していますが、IE 9 と同様、これらのブラウザーは MIME タイプが適切でないスタイルシートを適用することはありません。

IE 9 のユーザーは、このサイトを互換表示で表示することでバグを回避できます。IE 9 の互換表示では以前と同じ動作となり、外部リソースのダウンロード要求についてどのような MIME タイプでも受け入れるという指定になります。

Eric Lawrence