PHPで404エラーを正しく表示する方法の解説です。
存在しないページにアクセスされた時、ざっくり404エラーページにリダイレクトしたい場合は、
.htaccessに1行記載すればOKです。
例えば、以下のコードは、ページが見つからない場合、「正しく」404.htmlへリダイレクトしてくれます。
ErrorDocument 404 https://(ドメイン名)/404.html
これはこれで良いのですが、
例えば、もう少し特殊な例で、
PHPからMySQLのデータを呼び出した際に、不正なパラメータ値でアクセスされ、404ページを表示した場合。
PHPでどう記載すれば良いかの解説。
予め、自作404ページ「404.html」があるものとします。
よく使われるHTTPステータスコード一覧
その前に、とりあえず、よく使われるステータスコードの一覧です。
ステータスコード | ステータス | 意味 |
---|---|---|
200 | OK | 成功! |
301 | Moved Permanently | 永久的にリダイレクトされた。 |
302 | Moved Temporarily | 一時的にリダイレクトされた。 |
403 | Forbidden | ユーザーのアクセスが禁止された。 |
404 | Not Found | ページが見つからなかった。 |
まずは、ダメな例
header("HTTP/1.1 404 Not Found"); header("Location: "http://(ドメイン名)/404.html"); exit;
1行目で「HTTP/1.1 404 Not Found」を指定しているのは良いのですが、
次の「Location: 〜」で転送設定しているので、ステータスコードは「404」ではなく「302」となってしまいます。
一見、自分で用意したNotFound 404ページが表示されるので、
「404エラー処理してるのかなー」っと思いがちですが、
実際は、見た目だけ404で、検索エンジンは302として解釈されます。
302エラーは、リダイレクト先へ「一時的に」移動されたことを意味するので、
ファイルが見つからなかった404エラーとは全く別の意味となります。
HTTPヘッダーの確認(WEBサービスで確認)
以下のページから、HTTPヘッダーがどのようになっているか確認することができます。
ページ上部「URL/ドメイン」の欄にリダイレクトされる前のURLを入力してみてください。
上記の間違った例の場合は、302エラーになるはずです。
良い例は、ズバリこれ
header("HTTP/1.1 404 Not Found"); include($_SERVER['DOCUMENT_ROOT'].'/404.html'); exit;
ポイントは2行目で、
404.htmlへリダイレクトするのではなく、
「現在のページに404.htmlを取り込む」というという構造になっています。
PHP関数にして使う場合の例
ページが多くあり、いろんなダメパラメーターでアクセスされる可能性がある場合は関数にしておくと何かと便利です。
<?php if (何かの判断){ err404(); } function err404() { header("HTTP/1.1 404 Not Found"); include($_SERVER['DOCUMENT_ROOT'].'/404.html'); exit; } ?>
注意点としては、
404ページを外部ファイルとして取り込む構造上、エラー判断は、<html>タグ(または<!doctype html>)の前で行ってください。
また、自作404ページは、どのタイミングで呼び出されても良いように、ファイルパスは相対パスではなく、絶対パスで指定してください。
例:
<!-- ダメな例 --> <img src="img/title.png"> <!-- 良い例 --> <img src="/img/title.png"> <img src="http://xxxxxx.com/img/title.png">
コメント