カテゴリー
WordPressカスタマイズ

404が発生したページを確認する

404ページはユーザーがアクセスしようとしたウェブページが見つからない場合に表示されるエラーページでサーバーがリクエストされたリソースを見つけられないことを示しています。 この記事では、404エラーログを記録し、解析する方法について説明します。 また、実際の404エラーでは何が起こっているか?解析の意義とメリットも解説します。

通常のアクセス解析では、404エラーが発生したページURLではなく、表示された404ページ自体へのアクセスとして記録されるため、どのページで404エラーが発生したのかまでは分からないことが多いです。

それでは、404 not found のページを確認する方法はないのでしょうか?
いいえ、実際の生のアクセスログでは、リクエストされた具体的なURL自体が記録されています。

404エラーの解析

それでは、PHPの$_SERVER['REQUEST_URI']を利用して404エラーが発生した際にリクエストされたURLを取得してログに残してみます。
これにより、どのページURLに対して404エラーが発生したのかを特定できます。

WordPressのスケジュールイベント wp-cron によって毎日自動で実行されます。

404エラーログを保存

function log_404_to_daily_log() {
    if (is_404()) {
 // if (http_response_code() == 404) {
        $requested_url = esc_url($_SERVER['REQUEST_URI']);
        $log_entry = date("Y-m-d H:i:s") . " 404 error: " . $requested_url . "\n";
        
        // 今日の日付を基にログファイル名を決定
        $date = date("Y-m-d");
        $log_file = WP_CONTENT_DIR . '/404_errors/404_errors_' . $date . '.log';
        
        // ディレクトリが存在しない場合は作成
        if (!file_exists(WP_CONTENT_DIR . '/404_errors')) {
            mkdir(WP_CONTENT_DIR . '/404_errors', 0755, true);
        }
        
        // 日付ごとのログファイルに書き込む
        file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX);
    }
}
add_action('template_redirect', 'log_404_to_daily_log');

file_put_contentsはログファイルにデータを書き込むための関数です。
date("Y-m-d")で今日の日付を取得し、YYYY-MM-DD形式の文字列に変換します。
これを日毎のログファイル名として、wp-content/404_errors/ディレクトリ内に404_errors_YYYY-MM-DD.log の形式で保存します。

たとえば、2024年8月29日のログファイルは 404_errors_2024-08-29.log という名前になります。

これをお使いのテーマのfunctions.phpなどに記述します。
また、404の条件判定にWordPressの内部関数is_404()を使わない場合はhttp_response_code() == 404 を使います。
is_404()はWordPressのテンプレート階層を利用し、WordPress内で404エラーを判定する。
対して、http_response_code()はWordPress外でも機能し、PHPのレスポンスコードに基づく判定を行います。

ログを指定期間で自動削除する

このままでは、ログが溜まり続けるため、自動削除する処理を加えておきます。

if (!wp_next_scheduled('clean_old_404_logs_event')) {
    wp_schedule_event(time(), 'daily', 'clean_old_404_logs_event');
}

// イベントに対応するクリーンアップ処理
add_action('clean_old_404_logs_event', 'clean_old_404_logs');

function clean_old_404_logs() {
    $log_dir = WP_CONTENT_DIR . '/404_errors';
    
    // ディレクトリが存在する場合に処理を行う
    if (file_exists($log_dir)) {
        $files = glob($log_dir . '/*.log');  // すべてのログファイルを取得
        $ten_days_ago = strtotime('-10 days');

        foreach ($files as $file) {
            if (filemtime($file) < $ten_days_ago) {
                unlink($file);  // 10日以上前のファイルを削除
            }
        }
    }
}

この削除処理が正常に動作していることを確認するため、定期的にログディレクトリをチェックしてください。

404エラーの解析の意義とメリットは?

ユーザーエクスペリエンスの向上

ユーザーエクスペリエンスはユーザーがサービスを利用する際に感じる全体的な体験です。
404エラーはユーザーのフラストレーションの原因となります。
これはサイトの信頼性を損なう要因となります。
404エラーの解析によって、ユーザーがどのページでつまずいているかを特定し、リダイレクトを設定したり、リンク切れを修正することで、サイトの使いやすさを向上させることができます。

SEO的要素

内部リンクや外部リンクが404エラーを返す場合、検索エンジンのクローラーがページを正常にインデックスできなくなる可能性があります。
意図した挙動であれば問題ありませんが、404エラーを適切に解析し、処理することで適切なクロールを保つことができます。

トラフィックの回復

404エラーが発生しているURLに以前は多くのアクセスがあった場合、適切なリダイレクトを設定することで、失われたトラフィックを回復できます。
外部リンクからのトラフィックを逃すことを防ぐためには、リンク切れのページを特定し、関連する新しいページに誘導することが重要です。

セキュリティリスクの把握

悪意のあるボットやハッカーがサイトの脆弱性を探すために無効なURLへのアクセスを試すことがあります。
頻繁に404エラーが発生している場合、それが通常のユーザーによるものか、攻撃を試みているかを判断できます。
必要に応じて防御対策を講じるための指標となるでしょう。

404エラーログの例

わたしのサイトでの実際のログの一部を紹介します。
純粋な404エラーは最初の画像へのアクセスだけで、これは削除した画像ファイルへのアクセスです。

それ以外の特定のファイルやフォルダにアクセスしようとする試みはスパムまたは悪意のあるボットによるものです。
とくに、/admin/ や /wp-includes/ のようなディレクトリにアクセスは攻撃の可能性が高いため、注意が必要です。

2024-09-06 06:49:11 404 error: /wp-content/uploads/2014/06/loginrebuilder2-1-696x635.jpg
2024-09-06 06:49:35 404 error: /Site/
2024-09-06 06:49:40 404 error: /system/
2024-09-06 06:49:53 404 error: /shop/
2024-09-06 06:49:58 404 error: /files/
2024-09-06 06:50:02 404 error: /admin/editor/
2024-09-06 06:50:07 404 error: /include/
2024-09-06 06:50:07 404 error: /wp-includes/js/jQuery/jQuery.js
2024-09-06 06:50:11 404 error: /Assets/
2024-09-06 06:50:17 404 error: /images/stories/
2024-09-06 06:50:23 404 error: /plugins/
2024-09-06 06:50:28 404 error: /php/
2024-09-06 06:50:34 404 error: /wp-includes/js/jQuery/jQuery.js
2024-09-06 06:50:36 404 error: /wp-includes/js/jQuery/jQuery.js
2024-09-06 06:50:42 404 error: /admin/images/slider/
2024-09-06 06:50:46 404 error: /admin/fckeditor/editor/filemanager/
2024-09-06 06:50:50 404 error: /sites/default/files/
2024-09-06 06:50:53 404 error: /wp-includes/js/jQuery/jQuery.js
2024-09-06 06:50:55 404 error: /admin/controller/extension/extension/
2024-09-06 06:50:59 404 error: /modules/mod_simplefileuploadv1.3/elements/
2024-09-06 06:51:05 404 error: /components/
2024-09-06 06:51:10 404 error: /admin/uploads/images/
2024-09-06 06:53:05 404 error: /wp-includes/js/jQuery/jQuery.js
2024-09-06 06:53:07 404 error: /wp-includes/js/jQuery/jQuery.js
2024-09-06 06:54:19 404 error: /wp-includes/js/jQuery/jQuery.js

GA4で確認できないか?

多くのサイトで導入されている Google Analytics で404ページを確認することも不可能ではありません。
GA4で404ページを確認するには、表示された404エラーページを追跡し、その前にユーザーがどのページを参照していたかを分析することが基本となります。

ただし、GA4は JavaScript が有効なページでのみデータを収集するため、スクリプトが実行されない状況、たとえば、サーバーレベルで404エラーが返された場合やクローラのボットアクセスでは、404エラーページがトラッキングされません。
GA4でトラッキングできる404エラーはかなり限定的です。

profile image

執筆:R3098

WEBサービス構築・監修が生業です。WordPress 関連では Aurora Heatmap などのプラグイン開発も行っています。サイト運営者の力になりたいと考えます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトは reCAPTCHA によって保護されており、Google のプライバシーポリシー利用規約が適用されます。

reCaptcha の認証期間が終了しました。ページを再読み込みしてください。