PHPで404:Not Found(見つかりません)を検出する

こんにちは、さるまりんです。

お気に入りのレストランに行ってみよう!で、行ってみたら「あれ、お店なっくなってるよ。」ってなると寂しいですよね。

ホームページを作っているとリンク切れって発生してしまうことがあります。似たような状態かな。
作った時には存在してリンクを貼らせてもらってたのに情報が古くなってしまってもうなくなってしまったといったものです。

HTTPステータスコード

Webページにアクセスした時にサーバーからHTTPステータスコードという3桁の数字が返されます。この数字によってどんなものが返されたかわかります。

例えば、今このページにアクセスしてもらった時には要求してもらったものを正しく返せたという意味の200(OK:成功)というコードが返っています。

これが要求されたものが見つからない時は404(Not Found:見つかりません)が返されます。

数字は5種類に分けられていて大まかに次のような意味があります。

1xx 情報 (Information)

要求を受け取りました。処理を続けます。

2xx 成功 (Success)

要求を受け取り、処理しました。

3xx 追加処理 (Redirection)

要求を完了するためには、追加の処理が必要です。

4xx クライアントエラー (Client Error)

要求した側に誤りがあってそれを完了することができません。

5xx サーバーエラー (Server Error)

サーバーが要求の処理に失敗しました。

404(見つかりません:Not Found)を検出する

HTTPステータスコードの中に「見つかりません」を示すコードがあります。404です。
リンク先がなくなっているかを判断する時、厳密には404以外も考慮しなければいけないと思いますが、ひとまずはこの「見つからない」を意味する404の検出です。

これをPHPのプログラムでやってみます。

curlをつかって実現しています。(is_404.php)

// アクセスしたいURL
$url = "https://example.com/abc";

$ch = curl_init(); // はじめます。

// アクセスしたいURLをセット
curl_setopt($ch, CURLOPT_URL, $url);
// 取得結果を得るための設定
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

echo "「{$url}」にアクセスしています\n";

// 実行
$result = curl_exec($ch);

// 成功していれば
if($result != false){
    // その時の情報を取得
    $header = curl_getinfo($ch);
}
// 終わります。
curl_close($ch);

// 取得した情報からHTTPステータスコードを取り出します。
$status = $result ? $header['http_code'] : false;

// 結果を出力します
if($status == 404)
    echo "404です\n";
else
    echo "404ではないです\n";

実行結果です。

php is_404.php
「https://example.com/abc」にアクセスしています
404です

先にも触れたように、404を検出するだけではなくなっているということは判断できないです。例えばサイトごとなくなっていた時にはcurl_exec()が失敗しfalseが返ってくるケースもあります。

まだまだ改良していけますね。頑張っていきたいと思います。

読んでくださってありがとうございます。

ではまた!