ErrorDocument 「HTTP 404 - ファイル未検出」ではかっこわるい!

WWWサーバは、クライアント(ブラウザー)からリクエストを受けると、レスポンスメッセージをクライアントへ返します。そのメッセージの中に、ステータスコードといって、処理結果を示すコードが含まれています。このコードは3桁の数字で、HTTPで定義されています。

このコードに応じて、指定のページへリダイレクトさせることができます。ネットサーフィンをしているときに、よく「HTTP 404 - ファイル未検出」や、「Not Found」をよく見かけませんか? これは、ステータスコードが「404」で、リクエストしたファイルが存在しないという意味です。

figure1 figure2

これは、もともとApacheのデフォルトで設定されいてるHTML、もしくは、サービス事業者が設定したHTMLです。ただ、Internet Explorer の場合には、ステータスコード「404」を受けると、上図のように、Internet Explorer内部に用意された画面を表示します。

これを自分オリジナルの画面にするには、「.htaccess」ファイルに、以下のように記述して下さい。3つあるうちのいずれかひとつだけを記述してください。

ErrorDocument 404 /bar/error.html
ErrorDocument 404 http://www.foo.ne.jp/bar/error.html
ErrorDocument 404 "File not found"

2 行目の Romote URL での指定の場合、サーバは、ステータスコード「404」を返しません。実は、リダイレクトステータスコードを返してしまいます。したがって、エラー表示用のページとして指定したURLが、ブラウザーのアドレスバーに表示されているはずです。( 1行目のローカルURLでの指定と、3行目のカスタマイズメッセージの場合には、アクセスしたURLが表示されたままです。) なお、3行目のカスタマイズメッセージの場合は、Internet Explorer だと表示されません。

以上のことをこちらで確認できます。Internet Explorer 、 Netscape それぞれでお試しいただくと違いがわかると思います。すべて、存在しないホームページにリンクをはっています。ブラウザーのアドレス欄に注意して試してみてくださいね。なお、ファイルが存在しない場合に表示するページは、「 http://www.futomi.com/error/error404.html 」で用意しています。

ローカル URL での指定時の注意点】

Internet Explorer では、ErrorDocument 指示子を使って、ローカルURLでカスタマイズページを表示するように設定しても、そのカスタマイズページが表示されない場合があります。その場合、Internet Explorer が持っているテンプレート HTMLを表示してしまいます。

Internet Explorer は、各ステータスコードごとに、受信バイト数のしきい値の設定を持っています。もし該当ページにアクセスした際に、サーバから受信したデータがしきい値より小さい場合には、いくら ErrorDocument 指示子を使ってカスタマイズ HTML を表示しようとしても、テンプレートが表示されてしまいます。

http://support.microsoft.com/default.aspx?kbid=218155

従って、カスタマイズHTMLのサイズを、このしきい値より大きくしてあげる必要があります。ステータスコード 404 では、512 バイトとなっているようです。従って、カスタマイズ HTML のサイズを、512 バイト以上の大きさで作成してください。

その他のステータスコード

さて、ステータスコード「404」以外にも、使えそうなコードがあります。以下にそれぞれの意味と、「.htaccess」の記述の方法を記します。

Unauthorized(401)

認証を必要とするページにアクセスしようとして、失敗した場合です。この場合には、Romote URL の指定を使うべきではありません。Local URL の指定を使ってください。前述の通り、Remote URL で指定の場合、ステータスコード「401」をクライアントに返さないため、クライアント側では認証エラーとなったことが分かりません。人が見ているぶんには問題ないのですが、もし、クライアントソフト側が、ステータスコードを判断して処理を分岐している場合には、致命的です。

ErrorDocument 401 /bar/error.html

Forbidden(403)

リクエストは受け取ったが、事情によりリクエストを受け付けなかった場合です。主に、ファイルのパーミッションが不適切であったり、もしくはそのファイルに対して、Apache の設定(.htaccess)でアクセス制限がかかっていたりした場合です。

ErrorDocument 403 /bar/error.html

Internal Server Error(500)

CGI がバグってたり、「.htaccess」の文法ミスの場合に表示されます。

ErrorDocument 500 /bar/error.html