404 Not Found をかっこよくしよう

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

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

これは、もともと Apache のデフォルトで設定されいてる HTML、もしくは、レンタルサーバー事業者が設定した HTML です。 これを自分オリジナルの画面にするには .htaccess ファイルに、以下のように記述して下さい。 3 つあるうちのいずれかひとつだけを記述してください。 また、それぞれの記述方法がどのような結果になるのかを確かめるために 「実際にアクセスしてみる」ボタンを押してみてください。

ローカル URL を指定する方法
ErrorDocument 404 /error/error404.html

実際にアクセスしてみる

リモート URL を指定する方法
ErrorDocument 404 https://www.futomi.com/error/error404.html

実際にアクセスしてみる

カスタムメッセージを指定する方法
ErrorDocument 404 "This page was not found."

実際にアクセスしてみる

2 つ目のリモート URL を指定する方法の場合、サーバーはステータスコード 404 を返しません。 実は、リダイレクトステータスコードを返してしまいます。 したがって、ブラウザーのアドレスバーにはエラー表示用のページとして指定した URL が表示されているはずです。 一方で、1 つ目のローカル URL を指定する方法と、3 つ目のカスタムメッセージを指定する方法の場合には、 アクセスした URL が表示されたままです。

3 つ目のカスタムメッセージを指定する方法では、メッセージに英語を指定することをお勧めします。 Apache のデフォルトの設定では、メッセージに日本語を指定してしまうと文字化けするはずですので注意してください。

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

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

401 Unauthorized

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

ErrorDocument 401 /error/error401.html
403 Forbidden

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

ErrorDocument 403 /error/error403.html
500 Internal Server Error

CGI のバグや .htaccess の文法ミスなどの場合に表示されます。

ErrorDocument 500 /error/error.html