【PHP】header関数とErrorDocument 404

WEBサイトの制作において、エラーページの表示は重要です。

基本的には、404エラー等は、.htaccess に記述する、ErrorDocument により制御できます。

たとえば、次のように .htaccessに記述します。

ErrorDocument 404 /error/404.html

基本中の基本ですね。ちなみに、遷移先のパスは相対パスにしないと404ステータスにならない場合があります。つまり、絶対パス(URL)ではなく、相対パスにするということです。

他方で、PHPのスクリプトによっても、404ステータスを発行することが可能です。

PHPの場合には、header関数により、次のように記述します。

header("HTTP/1.0 404 Not Found");

http://jp1.php.net/manual/ja/function.header.php

上記の記述により、ブラウザに404ステータスを送出できます。

しかし、ここで大きな問題に直面します。

どういう問題かというと、PHPのheader関数により、404ステータスを送出した場合には、自動的には、/error/404.html には遷移しないのです。

これは、少々、面倒なことになります。

というのも、header(“HTTP/1.0 404 Not Found”); の後に、header(“Location: http://~”); とロケーションを付け足してやるとエラーページに遷移はするものの、ヘッダーステータスが302に変更され、404ではなくなってしまうからです。

この対応策ですが、/error/404.htmlをfile_get_contents ()関数などで、読み込んで、出力するのも一つの方法となります。

header("HTTP/1.0 404 Not Found");

$error_page = file_get_contents('../error/404.html')

echo $error_page;

exit;

こうすることで、一応、ErrorDocumentの場合とPHPの場合で同一の404ファイルを出力することができます。
また、file_get_contentsの代わりに、require_once等でエラーファイルを読み込む方法も考えられます。

なお、取得するファイルのパスは、サイトの構造により修正が必要です。

もっとも、404ファイルを動的に作成している場合には、上手くいかない場合もあるので注意が必要です。

この件で、他に良い方法があれば、コメントください。

以上です。

カテゴリー: PHP パーマリンク

コメントを残す

メールアドレスが公開されることはありません。