Hebikuzure's Tech Memo

2013年5月13日

HTTP エラーを簡易表示する

Filed under: Internet Explorer — hebikuzure @ 10:59 午後

「他のブラウザーだと正しく表示されるのに、Internet Explorer だと表示されない」という話はよく聞きますが、必ずしもInternet Explorer の機能が不足しているからという理由でそのような現象が起きる訳ではありません。逆に他のブラウザーにはない機能が原因の場合もあるのです。今回はそのような実例を紹介します。

あるメーリングリストで、特定の Web サイトでサイト内のページへのリンクをクリックすると、「他のブラウザーだと正しく表示されるのに、Internet Explorer だと表示されない」という現象が相談されていました。確かに Interenet Explorer を利用すると、そのページは「Web ページが見つかりません」と表示されます。他のブラウザーではページ内容が正しく表示されます。

この現象の原因を調べるきっかけは、「Web ページが見つかりません」と表示されたタブのタイトルに「HTTP 404 未検出」と表示されていたことです。

img_404

そこで Fiddler を起動して、問題のリンクをクリックした際の挙動を調べてみました。すると、サーバーから確かに HTTP 404 レスポンスが返っていることが確認できました。

img_fiddler1

ところがこのヘッダーをよく見ると、メッセージ ボディを chunked エンコードで送信していることがわかります。そのため次にこのメッセージ ボディを確認してみました。

img_fiddler2

このスクリーンショットは Fiddler の Inspectors で WebView 表示したものですが、確かにここに他のブラウザーで表示されるのと同じコンテンツがありました。さらに他のブラウザーで表示した際の HTTP フレームを調べると、Internet Explorer で表示した場合と同じレスポンス ヘッダー、レスポンス ボディが返っていることが確認できました。そうすると、同じサーバー レスポンスが他のブラウザーでは表示できて、Internet Explorer では表示できないという事になります。これはなぜでしょうか。ここで注意すべきなのはサーバー レスポンスは通常の 200番台では無く、HTTP 404 である点です。つまりこのメッセージ ボディは本来のページ コンテンツではなく、エラー メッセージなのです。

そこで Internet Explorer には「HTTP エラーを簡易表示する」という機能があることを思い出しました。この機能については以下の記事に詳しい解説がありますが、400番台、500番台のエラー ステータスがサーバーから返された場合で、エラー メッセージ ボディが 256バイトまたは 512バイト以下の場合、Internet Explorer はサーバーが返したエラー メッセージでは無く「簡易エラー (Friendly HTTP Error)」を表示する動作です。

Friendly HTTP Error Pages
http://blogs.msdn.com/b/ieinternals/archive/2010/08/19/http-error-pages-in-internet-explorer.aspx

問題のページのメッセージ ボディの内容はもちろん 512バイト以上ですから、「HTTP エラーを簡易表示する」が有効でも表示されるはずだと考えられますが、どうもメッセージ ボディが chunked エンコードされていて、ヘッダーに content-length が無いため、簡易表示が行われていると思われます。

そこでインターネット オプションの [詳細設定] タブで、[HTTP エラーを簡易表示する] を無効にすると、Internet Explorer でも他のブラウザーと同様の表示になりました。これで一件落着なのですが、本来はエラー メッセージを表示すべき HTTP 404 レスポンスでコンテンツを表示させようとする Web サイトが一番の問題です。メーリング リストの質問者はサイト管理者に問題を報告して改善を求めたようですが、残念ながら未だに動作は変わっていないようです。

なお、「HTTP エラーを簡易表示する」という機能があるのは、「404 Not Found」というような極めてあっさりしたエラー メッセージが表示されても一般のユーザーにはどのような問題が起きているのか理解しにくいと考えられ、それに配慮したメッセージが表示されるようするためです。

いずれにせよ、サーバー管理者の皆さんは、エラー ステータスの HTTP レスポンスでエラー メッセージ以外のコンテンツを返すのは止めましょう。

コメントする »

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを残す

WordPress.com Blog.