通常のアクセス解析では、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-0606:49:11404 error: /wp-content/uploads/2014/06/loginrebuilder2-1-696x635.jpg
2024-09-0606:49:35404 error: /Site/
2024-09-0606:49:40404 error: /system/
2024-09-0606:49:53404 error: /shop/
2024-09-0606:49:58404 error: /files/
2024-09-0606:50:02404 error: /admin/editor/
2024-09-0606:50:07404 error: /include/
2024-09-0606:50:07404 error: /wp-includes/js/jQuery/jQuery.js
2024-09-0606:50:11404 error: /Assets/
2024-09-0606:50:17404 error: /images/stories/
2024-09-0606:50:23404 error: /plugins/
2024-09-0606:50:28404 error: /php/
2024-09-0606:50:34404 error: /wp-includes/js/jQuery/jQuery.js
2024-09-0606:50:36404 error: /wp-includes/js/jQuery/jQuery.js
2024-09-0606:50:42404 error: /admin/images/slider/
2024-09-0606:50:46404 error: /admin/fckeditor/editor/filemanager/
2024-09-0606:50:50404 error: /sites/default/files/
2024-09-0606:50:53404 error: /wp-includes/js/jQuery/jQuery.js
2024-09-0606:50:55404 error: /admin/controller/extension/extension/
2024-09-0606:50:59404 error: /modules/mod_simplefileuploadv1.3/elements/
2024-09-0606:51:05404 error: /components/
2024-09-0606:51:10404 error: /admin/uploads/images/
2024-09-0606:53:05404 error: /wp-includes/js/jQuery/jQuery.js
2024-09-0606:53:07404 error: /wp-includes/js/jQuery/jQuery.js
2024-09-0606:54:19404 error: /wp-includes/js/jQuery/jQuery.js
GA4 で確認できないか?
多くのサイトで導入されている Google Analytics で404ページを確認することも不可能ではありません。
GA4 で404ページを確認するには、表示された404エラーページを追跡し、その前にユーザーがどのページを参照していたかを分析することが基本となります。
ただし、GA4 は JavaScript が有効なページでのみデータを収集するため、スクリプトが実行されない状況、たとえば、サーバーレベルで404エラーが返された場合やクローラのボットアクセスでは、404エラーページがトラッキングされません。
GA4 でトラッキングできる404エラーはかなり限定的です。