Поиск 404 ошибки.

 

Основная цель поиск страниц которые ведут на страницы 404.

Первый этап был сканирование всех ссылок сайта и поиск битых ссылок.

Сканирование сайта.

Подготовка ссылок.

Первым делом проверяем есть ли у Вас карта сайта. Если нет, то ищем генератор sitemap, например https://gensitemap.ru/. Сохраняем xml файл, потом открываем его с помощью MS Exel, будет много предупреждений просто жмем Ок. Видим примерно следующее:

Удаляем заголовки и копируем первый столбец, потом вставляем ссылки в текстовый редактор, который сохраняет переходы на строку, в моем случае это Sublime Text 3, сохраняем как TXT.

Сканирование.

Скачиваем программу Xenu, ссылка и устанавливаем.

Запускаем и выбираем «Check URL List(Test)…», открываем файл с ссылками, после запуститься проверка ссылок. В процессе проверки лучше сохраняться(бываю сбои программы).

О том какие ссылки битые можно не показывать и не говорить, так будет понятно.

Отслеживание вызова страницы 404.

Для предотвращения появления новых 404 ошибок  и быстрого поиска написал простой скрипт который отправляет уведомление Вам на почту о том что был произведен переход на страницу 404.

<?php
if (isset($_SERVER['HTTP_REFERER'])) {
  $ref = $_SERVER['HTTP_REFERER'];
  if (strpos($ref, 'example-code.ru')) {
    $request = $_SERVER['REQUEST_URI'];
    $exceptions = [
    '.jpg','.jpeg','.png','.bmp','.gif', '.tiff',
     '.css','.js','.otf', '.ttf','.eot','.woff'
     ];
    foreach ($exceptions as $key => $var) {
      if (strrpos($request, $var))  {
        $match2[$var] = 1;
      }
    }
    if (count($match2) == 0) {
      $actual_link = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

      if($ref != $actual_link) {
        $to  = "<example@mail.com>" ;
        $subject = "Вызовы 404.";

        $message = '<p><b>From:</b> <a href="' . $ref . '">' . $ref . '</a></p>';
        $message.='<p><b>To:</b> <a href="'.$actual_link.'">'.$actual_link.'</a></p>';
        $message.='<p><b>Дата:</b> '.date('F, d.m.Y H:i:s').'</br></p>'."\n\n";
        $message.='<p><b>Дополнительные сведения:</b></br> '.implode('|',$_SERVER).'</p>';
        $headers  = "Content-type: text/html; charset=utf-8 \r\n";
        $headers .= "From: Сайт  <example@mail.com>\r\n";
        $headers .= "Reply-To: examplce@mail.com\r\n";
        mail($to, $subject, $message, $headers);
      }
    } else {
      die();
    }
  }
}
?>

Его можно внедрить в начале вызова шаблона 404 страницы.

Кратко о работе.

Проверяем, есть ли реферер. Проверяем что в реферере это страница моего сайта.

Проверяем адрес страницы вызова 404. Массив $exps хранит данные расширений(можно убрать, если не нужно) с которых не будет отправляться письмо и отображаться страница 404.

$actual_link — адрес текущей страницы.

$ref — реферер.

Формируется тело письма, и отправляем.