Проверка кодов ответа: как найти страницы, которые отвечают неправильно

Проверка кодов ответа: как найти страницы, которые отвечают неправильно
Анатолий Кузнецов
Анатолий Кузнецов
SEO-оптимизатор с 20-летним стажем. Автор блога seo-prodvizhenie-biznesa.ru о продвижении и доработке сайтов.

Проверка кодов ответа страниц почти всегда начинается с одной сцены: владелец открывает адрес в браузере, видит нормальную страницу, а в панели вебмастера этот же адрес висит в списке ошибок. Обе картины верны одновременно. Браузер и робот получают от сервера разные ответы: они приходят в разное время, с разными заголовками, из разных сетей и без вашего кэша. Пока вы смотрите глазами, вы проверяете не сервер, а собственный браузер.

Почему браузер показывает страницу, а робот видит ошибку

Код ответа — трёхзначное число, которое сервер ставит в первой строке ответа ещё до того, как отдаст хоть один символ разметки. Браузер его получает, но обычно не показывает: если в теле ответа есть HTML, он отрисует HTML независимо от того, стоит там 200 или 500. Робот поступает наоборот, для него число важнее содержимого: при 200 он читает и индексирует, при 404 и 410 выводит адрес из индекса, при 500 откладывает страницу и снижает темп обхода, при 30x идёт по цепочке.

Расхождение возникает по четырём проверяемым причинам:

  • Кэш. Браузер хранит копию страницы, плагин кэширования — готовый HTML, перед ними может стоять CDN. Вы получаете ответ из кэша, робот — с живого сервера, где страница собирается с нуля и может упереться в таймаут базы.
  • Cookie и сессия. Авторизованному в админке сайт отдаёт версию без ограничений, анонимному посетителю — редирект на форму входа или заглушку.
  • User-Agent и IP. Часть защит от парсинга реагирует на строку агента и на подсеть. Человек с домашнего провайдера проходит, робот получает 403 или капчу с кодом 200. Второй вариант хуже: ответ успешный, а в индекс идёт текст проверки.
  • Нагрузка. Один запрос из браузера — лёгкий случай. Обход робота — десятки параллельных соединений, и лимиты, которые вручную не срабатывают, срабатывают там.

На моём сайте был показательный эпизод из последней категории. Сервер начал отдавать код 429 на собственные файлы стилей, когда браузер запрашивал их пачкой в несколько параллельных соединений. Визуально страница открывалась: HTML приходил с кодом 200, часть стилей успевала загрузиться, вёрстка не рассыпалась настолько, чтобы это бросалось в глаза. А в сетевой панели половина CSS-запросов была помечена ошибкой «слишком много запросов». Причина оказалась в модуле ограничения частоты: он считал обращения к статике наравне с обращениями к скриптам. Глазами такое не ловится.

Коды ответа, которые действительно нужно знать

Список кодов в спецификации длинный, но на реальном сайте встречается десяток. Ниже те, что попадаются в каждом втором аудите.

Код Что означает Что делает робот Когда это проблема
200 Успешный ответ, тело отдано Читает и индексирует содержимое Если тело — «ничего не найдено», капча или пустой шаблон
301 Постоянный переход на другой адрес Переносит сигналы на цель, старый адрес убирает Стоит там, где ожидается рабочая страница
302 / 307 Временный переход Оставляет в индексе исходный адрес Поставлен вместо 301 при постоянном переезде
304 Не изменилось с прошлого визита Берёт содержимое из кэша, экономит обход Отдаётся при реально изменившемся содержимом
403 Доступ запрещён Не индексирует, при массовости снижает темп обхода Прилетает роботу от защиты, посетителю нет
404 Страница не найдена Выводит из индекса не сразу, проверяет повторно Массово, на адресах с внешними ссылками
410 Удалено навсегда Выводит из индекса быстрее, чем при 404 Поставлено на страницу, которую планируют вернуть
429 Слишком много запросов Резко снижает скорость обхода, часть адресов пропускает Почти всегда: лимит без учёта роботов
500 Внутренняя ошибка сервера Откладывает адрес, при повторе выводит из индекса Всегда, даже если ошибка плавающая
502 / 504 Шлюз не дождался ответа Трактует как временный сбой, вернётся позже Повторяется в одни и те же часы
503 Сервис недоступен С заголовком Retry-After вернётся позже, без него — как сбой Висит дольше нескольких часов

Разница между 301 и 302 влияет не на скорость, а на то, какой адрес останется в поиске; она разобрана в материале Отличие 301 от 302 редиректа. И ещё нюанс: 404 не ошибка сама по себе — ошибкой её делает контекст, когда по адресу приходят люди, ведут внешние ссылки или ссылается ваше же меню.

Мягкая 404: код 200 там, где содержимого нет

Самая частая находка — не 500 и не 404, а страница, которая говорит «товар не найден» или «по вашему запросу ничего нет», и при этом отдаёт код 200. Такие адреса называют мягкими 404. Робот доверяет коду, забирает страницу в обход и уже сам решает по содержимому, что она бесполезная. Разница принципиальная: честная 404 закрывает вопрос за один визит, а мягкая продолжает съедать лимит обхода и попадает в отчёты как малоценная страница.

Откуда берутся:

  • Карточки удалённых товаров, подменённые шаблоном «товар недоступен».
  • Пустые результаты фильтров и внутреннего поиска, доступные по прямой ссылке.
  • Категории, из которых убрали все позиции, но раздел остался в меню.
  • Собственная страница 404, оформленная как обычная страница CMS — с кодом 200 в заголовке.

Последний пункт проверяется первым. Возьмите заведомо несуществующий адрес вида /proverka-koda-otveta-123456/ и посмотрите заголовок ответа. Если там 200 — у вас нет 404 вообще, и любая опечатка в ссылке порождает новую страницу в индексе. Последствия описаны в статьях Ошибка 404 — что это значит и Как ошибка 404 влияет на позиции сайта.

Дальше выбор зависит от того, есть ли замена содержимому. Есть аналог или родительская категория — 301 на замену. Замены нет, адрес разово попал в индекс — 404. Раздел закрыт навсегда — 410. Заменять всё подряд редиректом на главную нельзя: робот распознаёт подстановку и трактует её как ту же мягкую 404, только с лишним переходом.

Ошибки 500 и 429 в обходе: когда сервер не выдерживает робота

Пятисотые коды в отчёте обхода — самая недооценённая находка. Владельцу они кажутся случайностью: «я открыл, всё работает». В том и дело: вы открыли одну страницу, робот — сотню за минуту. Механизмов несколько.

Лимит соединений к базе. Пока на сайте пара человек, он незаметен; робот открывает десятки страниц параллельно, лимит выбирается, и часть страниц падает с фатальной ошибкой PHP. Рядом — нехватка памяти на тяжёлых страницах: категория с сотнями позиций или архив за год при одиночном запросе в лимит укладываются, при параллельных нет.

Ограничение частоты запросов. Модуль защиты считает обращения с одного адреса и после порога отдаёт 429 или 403. Робот заходит с пула адресов в пределах одной подсети и легко перешагивает порог — ровно тот случай, что я описал выше со стилями.

Плавающие ошибки в коде. Обращение к несуществующему свойству, вызов функции, которой нет в текущей версии PHP. Они проявляются только там, где данные не заполнены, и всплывают именно при сплошном обходе.

Тонкое место хостинга. Виртуальный хостинг делит ресурсы между сайтами: соседний проект под нагрузкой — и ваш сервер отвечает 502 или 504. Видно по времени: ошибки собираются в одни и те же часы. Что смотреть, я разбирал в материале Как сервер влияет на продвижение интернет-магазина.

Проверять нужно две вещи: отчёт обхода в вебмастере и логи сервера. В логах доступа код стоит отдельным полем в каждой строке, и выборка строк с кодами от 500 сразу даёт список адресов и время. Если ошибки размазаны по сайту, а не липнут к типам страниц — дело в ресурсах, а не в шаблонах.

Долгий ответ сервера: код правильный, страница выпадает

Код 200 не гарантирует, что страница попадёт в индекс. Робот работает с ограничением по времени: если сервер не начал отдавать ответ за отведённый интервал, соединение обрывается и адрес отмечается как недоступный. Ошибки формально нет — сервер не успел.

Смотреть нужно на время до первого байта, а не на общее время загрузки: общее включает картинки, скрипты и шрифты, его портит фронтенд. Растягивают ответ запросы к базе без индексов, обращения к сторонним API прямо в шаблоне (курс валют, остатки склада), сломанный кэш и разросшаяся таблица настроек с автозагрузкой.

Показательный признак: страницы разных типов отвечают с разной скоростью. Статья блога — быстро, категория каталога — вдвое дольше, страница поиска — на грани таймаута. Значит, дело в шаблонах, а не в тарифе хостинга.

Редиректы там, где нужен код 200

Редирект должен стоять на старых адресах, которые вы переносили, и не должен — на страницах, которые вы продвигаете. Проверка кодов вскрывает три случая, когда 30x оказывается там, где ждали 200.

Цепочки. Адрес А ведёт на Б, Б на В, В на Г. Каждое звено накопилось своим слоем: переезд на https, смена структуры адресов, снятие слеша в конце. Робот проходит цепочку с ограничением по длине и слишком длинную бросает. Старый адрес должен вести сразу на конечный.

Петли. Адрес ведёт на себя или два адреса перебрасывают друг на друга. Источник — конфликт правил в конфигурации сервера и настройках CMS: одна часть добавляет слеш, другая убирает. В браузере это выглядит как «долго грузится», а не как ошибка.

Редиректы по устройству и региону. Мобильная версия на поддомене, определение города по IP, переброс на языковую версию. Робот приходит со своим набором заголовков и получает не тот адрес, который запрашивал. В индекс попадает не то, что вы продвигали.

Проверять цепочки нужно не по конечному коду, а по всему пути — инструменты показывают каждый шаг. Больше одного шага между исходным и целевым адресом — правьте правило.

Как прогнать все адреса пачкой

Точечная проверка отдельных страниц не даёт картины. Нужен сплошной прогон: берётся полный список адресов, каждый запрашивается, записываются код, время и цепочка переходов, результат сортируется по коду.

Список собирается из четырёх источников, и брать нужно все четыре, потому что они не совпадают. Карта сайта показывает, что вы считаете нужным для индексации; как её формировать — в материале Карта сайта Sitemap. Обход краулером — что реально доступно роботу из меню и текстов. Выгрузка из вебмастера — что робот видел сам. Логи сервера — адреса, по которым приходили запросы, вместе с выданными кодами.

Способ Что видит Сильная сторона Ограничение
Настольный краулер Коды, цепочки, время ответа, заголовки Контроль над скоростью и агентом, выгрузка в таблицу Идёт с вашего IP: защита пропускает вас как своего
Облачный сервис обхода То же плюс повторы по расписанию Заходит с чужих адресов, ближе к условиям робота Ограничение на число адресов в тарифе
Панель вебмастера Коды, которые получил сам поисковый робот Источник правды о том, что видел робот Данные с задержкой, выборка неполная
Логи сервера Все запросы всех агентов с кодами и временем Видно время суток, частоту, реакцию на нагрузку Нужен доступ к хостингу и разбор объёма
Скрипт с curl или Python Коды и заголовки по вашему списку Свой агент, своя частота, свой формат отчёта Нужно писать самому, нет разбора вёрстки

Порядок такой. Сначала запрос только заголовков — быстро и достаточно для кодов. Потом повторный прогон полным запросом по адресам, где код отличается от 200: часть серверов отвечает на укороченный запрос иначе, и это само по себе находка. Обязательно снимите отдельный прогон с агентом поискового робота и сравните с обычным. Скорость держите умеренной: положив сайт двадцатью потоками, вы получите массовые 500 на пустом месте.

Периодичность зависит от размера: сайт до сотни страниц — раз в квартал, каталог на тысячи адресов — раз в месяц. После переезда, смены хостинга или правки конфигурации сервера — сразу. Сплошной прогон кодов входит в базовый Технический аудит сайта и обычно даёт больше находок, чем анализ текстов.

Что делать с находками и когда чинить не нужно

Список из тысячи строк парализует, поэтому сортируйте по последствиям, а не по количеству. Первый приоритет — 500 и 429 на страницах, которые приносят трафик: страница выпадает из поиска, пока сервер отдаёт ошибку, и чинится тут сервер, а не SEO. Второй — редиректы и 404 там, куда ведут внешние ссылки и внутреннее меню: внутренние ссылки правятся в шаблоне, внешние править нельзя, поэтому там ставится 301 на ближайшую по смыслу живую страницу. Третий — мягкие 404: их много, они не горят, но раздувают индекс, разбирать нужно группами. Четвёртый — долгий ответ.

Теперь о том, когда чинить не нужно, — этот список экономит больше времени, чем предыдущий.

  • 404 на служебных и мусорных адресах. Опечатки в чужих ссылках, адреса от прежнего движка, обращения к несуществующим файлам. Робот отбросит их сам.
  • Код 403 на закрытых разделах. Личный кабинет, админка, корзина. Так и должно быть.
  • Код 304 при повторном обходе. Не ошибка, а экономия ресурса: содержимое не менялось.
  • Редирект с адреса без слеша на адрес со слешем. Если правило одно и внутренние ссылки ведут на канонический вид — трогать не нужно.
  • Одиночная 500, которая не повторяется. Разовый сбой при перезапуске сервиса бывает у всех. Проблема — это повтор, а не факт.

И честное ограничение метода: коды ответа не отвечают на вопрос, почему страница не растёт в поиске, — только на вопрос, может ли робот вообще её прочитать. Это фундамент, а не рычаг: сайт с идеальными кодами стоит на месте, если содержимое не отвечает запросу. Как робот распоряжается прочитанным — в материале Поисковые роботы — что это и как они работают.

Частые вопросы

Как посмотреть код ответа одной страницы без установки программ?
Откройте панель разработчика, перейдите на вкладку сети и обновите страницу. Первая строка в списке — документ, рядом с ним стоит число. Обновлять нужно с игнорированием кэша, иначе вы увидите 304 или ответ из памяти браузера, а не с сервера.

В отчёте вебмастера тысячи 404, а сайт маленький. Откуда?
Три источника. Старые адреса от предыдущей версии сайта — робот помнит их годами. Генерация адресов скриптами: пагинация до несуществующих страниц, параметры фильтров, календари. Битые ссылки в шаблоне. Закрывайте источник, иначе адреса будут появляться заново.

Сервер отдаёт роботу 429. Это опасно?
Опаснее, чем кажется. Робот воспринимает такой ответ как просьбу снизить темп и уменьшает число страниц за визит. Новые материалы индексируются неделями вместо суток, при этом ни одна страница не помечена ошибкой. Проверьте ограничитель частоты: обычно он считает статику наравне с динамикой.

Краулер показывает 200, а вебмастер — ошибку. Кому верить?
Вебмастеру: он показывает ответ, который получил сам поисковый робот со своих адресов и со своим агентом. Ваш краулер идёт с вашего IP и часто проходит там, где робота режет защита. Расхождение — не противоречие, а диагноз: у вас разная выдача для разных клиентов.

Проверять ли коды для картинок, стилей и скриптов?
Да, и это регулярно упускают. Робот рендерит страницу и подгружает ресурсы: если стили или скрипты отдают ошибку, он увидит страницу иначе, чем вы. Мой случай с кодом 429 на файлы стилей — ровно про это: HTML отдавался нормально, а часть оформления не приходила вовсе.

Коротко

  • Браузер показывает содержимое, робот читает код ответа. Пока вы проверяете глазами, вы проверяете свой кэш, а не сервер.
  • Мягкая 404 — страница «ничего не найдено» с кодом 200 — вреднее честной ошибки: остаётся в обходе и раздувает индекс.
  • Коды 500 и 429 у робота появляются из-за параллельной нагрузки: лимиты базы, память, ограничители частоты; вручную такое не воспроизводится. Долгий ответ обрывает обход при формально правильном коде 200 — смотрите время до первого байта по типам страниц.
  • Редиректы уместны на старых адресах и неуместны на продвигаемых: цепочки схлопывать до одного перехода, петли устранять.
  • Прогон делается сплошным списком из карты сайта, обхода по ссылкам, выгрузки вебмастера и логов: расхождения между источниками и есть находки.

Если после прогона получился список из сотен строк и непонятно, за что хвататься первым, — сортировка находок по последствиям важнее самого прогона. Приходите на разбор технических ошибок сайта — посмотрим ваш отчёт по кодам ответа, отделим реальные потери от безобидного шума и составим порядок правок. В SEO с 2005 года, продвижение веду лично, вы общаетесь со мной напрямую, а не с менеджером. Если нужна не разовая проверка, а постоянное SEO-сопровождение сайта, начинать всё равно стоит с технической базы — без неё остальное не работает.

Увеличьте позиции и продажи вашего сайта

Профессиональное SEO-продвижение с гарантией результата. Выберите подходящую услугу:

Анатолий Кузнецов — SEO-оптимизатор

Остались вопросы по продвижению?

Меня зовут Анатолий Кузнецов, я SEO-оптимизатор с 20-летним стажем. Разберу ваш сайт, отвечу на вопросы и подскажу, что улучшить для роста позиций в Яндексе и Google.

Связаться со мной →

Комментарии

Вильгельмина Пасечник

Проверила несуществующий адрес — сервер отдал 200 и красивую страницу «ничего не найдено». Это же настраивал разработчик специально, чтобы посетитель не пугался. Получается, зря?

Анатолий Кузнецов автор

Оформление страницы и её код ответа — две независимые вещи, их часто путают. Красивая страница с поиском, меню и подборкой популярных разделов — это правильно, посетитель действительно не должен упираться в белый экран с технической надписью. Но в заголовке ответа при этом обязан стоять 404, и на внешний вид это никак не влияет: человек его не видит вообще. Сейчас у вас любая опечатка в чужой ссылке порождает адрес, который робот считает рабочей страницей, забирает в обход и держит в индексе. На сайте с ручной вёрсткой код правится одной строкой в обработчике, в популярных CMS — переключателем в настройках шаблона 404 или снятием плагина, который эту страницу подменял. После правки проверьте ещё раз тот же выдуманный адрес: должно быть 404 при том же оформлении.

Радислав Ерофеичев

Прогнал каталог краулером в двадцать потоков, получил кучу 500. Испугался, перепрогнал в два потока — всё чисто. Так есть проблема или нет?

Милослава Тарбеева

В вебмастере растёт число исключённых страниц с пометкой про ошибку сервера, а я открываю их по одной — открываются нормально. Куда смотреть?

Анатолий Кузнецов автор

Смотреть надо в логи доступа на сервере, а не в браузер. В каждой строке лога есть адрес, время, агент и код ответа — выберите строки с кодами от 500 и посмотрите на две вещи. Первая: липнут ли ошибки к определённым типам страниц. Если падают только категории каталога или только страницы поиска, дело в шаблоне и в тяжёлых запросах к базе. Вторая: собираются ли ошибки в определённые часы. Если да, это нагрузка — либо ваш обход совпал с чужим, либо на виртуальном хостинге сосед ест ресурс. Отдельно отфильтруйте строки по агенту поискового робота: часто оказывается, что 500 приходят только ему, а обычным посетителям сайт отвечает нормально. И проверьте лог ошибок PHP за то же время — там будет конкретная строка кода, из-за которой страница падала.

Савватий Голомазов

Про 429 на собственные стили — интересный случай. У нас стоит модуль защиты от ботов, и я теперь думаю, не режет ли он робота. Как это проверить, не отключая защиту?

Зоряна Мохначёва

Магазин переезжал дважды: сначала на https, потом меняли структуру адресов. Краулер показывает цепочки по три-четыре перехода. Насколько это критично, если в итоге всё же открывается нужная страница?

Панкрат Ослопов

Удалили из каталога около четырёхсот позиций. Ставить на все 404, 410 или редиректить на категорию? Мнения в интернете расходятся полностью.

Анатолий Кузнецов автор

Мнения расходятся, потому что универсального ответа нет — решение зависит от того, что было на странице. Разделите четыреста позиций на три группы. Первая: товар снят, но есть прямая замена — другая модель, тот же товар другого объёма или цвета. Такие ставьте на 301 к замене, это сохранит внешние ссылки и поведение посетителя. Вторая: замены нет, но позиция может вернуться на склад — отдавайте 404 и оставьте адрес в покое, робот выведет его из поиска и запомнит. Третья: направление закрыто полностью и не вернётся — 410, чтобы вывести быстрее. Чего делать не стоит: сваливать все четыреста на главную или на корень каталога. Робот распознаёт массовый редирект в одну точку и обрабатывает его как ту же 404, только с лишним переходом, а посетитель с внешней ссылки попадает не туда, куда шёл, и уходит.

Агафья Шумилкина

Есть ли смысл проверять коды ответа, если сайт маленький — двадцать страниц лендинга с блогом?

Елизар Подопригора

Наш сервер отвечает 503 во время ночных бэкапов, примерно час. Робот в это время заходит. Надо что-то делать или само пройдёт?

Анатолий Кузнецов автор

Само не пройдёт, но чинится это малой кровью. Код 503 сам по себе безопасен, если он отдаётся правильно: вместе с ним сервер должен присылать заголовок Retry-After с указанием, через сколько возвращаться. Тогда робот понимает, что это плановая недоступность, не считает её ошибкой сайта и приходит позже. Без этого заголовка повторяющаяся недоступность трактуется как нестабильный сервер, и темп обхода снижается. Проверьте, что именно отдаёт ваш сервер во время бэкапа — скорее всего, там голая 503 или вовсе 502 от шлюза. Второй вариант решения проще: сделать бэкап без остановки сайта, через снимок файловой системы или репликацию базы, тогда недоступности не будет вообще. И посмотрите в логах, приходит ли робот именно в этот час — если да, сдвиньте окно бэкапа на время, когда его активность минимальна.

Соломонида Верещак

Краулер показал время ответа по некоторым категориям в несколько раз больше, чем по остальным. Код при этом 200. Это уже проблема или ещё нет?

Азарий Ключевский

Обнаружил, что сайт отдаёт разный ответ на запрос с агентом поискового робота и с обычным браузерным. Это же клоакинг получается? Разработчик говорит, что так настроена оптимизация.

Ефимия Кожедуб

Прогнала карту сайта и обход по ссылкам — списки адресов совпали процентов на шестьдесят. Что делать с разницей?

Анатолий Кузнецов автор

Разница и есть главная находка, её нужно разложить на две стопки. Первая: адреса есть в карте сайта, но краулер до них не дошёл по ссылкам. Это страницы-сироты — на них не ведёт ни меню, ни текст, ни листинг. Робот их увидит через карту, но без внутренних ссылок они получают минимум веса и обходятся редко. Решение — вписать их в структуру: добавить в раздел, в перелинковку внутри статей, в подборки. Вторая стопка: краулер нашёл адреса, которых нет в карте сайта. Тут надо смотреть, что это. Если полезные страницы — карта формируется неправильно, чаще всего плагин исключает целый тип записей. Если мусор вроде фильтров, сортировок и параметров — вы нашли источник лишнего обхода, и его нужно закрывать канониклом или запретом в robots. Начинайте со второй стопки: там обычно и прячется причина, почему робот не доходит до нужных страниц.

Вукол Тарарыкин

После обновления движка половина адресов стала с косой чертой на конце, половина без. Оба варианта открываются, код 200 у обоих. Насколько срочно это править?

Прокрутить вверх