Коды ответа сервера и Last-Modified: как ускорить переобход в 5 раз

Коды ответа сервера и Last-Modified: как ускорить переобход в 5 раз

Есть один заголовок HTTP, о котором не знает подавляющее большинство владельцев сайтов, и который при этом определяет, как быстро поисковый робот замечает ваши изменения. Называется он Last-Modified. На сайте с тысячей страниц его правильная настройка способна ускорить переобход в несколько раз — без ссылок, без текстов, без бюджета. И наоборот: неверная настройка означает, что робот каждый визит скачивает весь сайт целиком, тратя лимит на страницы, которые не менялись два года.

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

Коды ответа: что робот на самом деле слышит

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

КодСмыслКак реагирует поисковикГде применять
200 OK Страница существует, вот содержимое Индексирует Все рабочие страницы
301 Moved Permanently Переехало навсегда Заменяет старый адрес новым, передаёт вес Смена URL, склейка зеркал, слэши
302 Found Временно переехало Оставляет в индексе старый адрес Действительно временные случаи
304 Not Modified С прошлого раза не менялось Не качает страницу, экономит бюджет Ответ на условный запрос
404 Not Found Такой страницы нет Постепенно исключает из индекса Удалённые страницы без замены
410 Gone Была и удалена навсегда Исключает быстрее, чем 404 Осознанно удалённый контент
500 Internal Server Error Сломалось на сервере Тревожный сигнал, снижает частоту обхода Нигде — это авария
503 Service Unavailable Временно недоступно, зайдите позже Сохраняет страницу в индексе, приходит снова Плановые работы, перегрузка

Две строки в этой таблице стоят того, чтобы остановиться подробнее.

503 — недооценённый спасатель. Когда сайт лежит на техобслуживании и отдаёт 404 или, того хуже, 200 с пустой страницей, робот делает выводы: страницы больше нет либо содержимое обнулилось. Пара таких визитов — и позиции просели. Правильный ответ на время работ — 503 с заголовком Retry-After, который сообщает, когда возвращаться. Поисковик спокойно уходит и приходит позже, ничего не теряя.

302 вместо 301 — тихий убийца переездов. Разница в одной цифре, а последствия принципиальные: при 302 поисковик считает, что старый адрес актуален, и продолжает держать его в индексе, не передавая вес новому. Сайты годами живут на временных редиректах и не понимают, почему новая структура не набирает силу. Механика разобрана в материале про 301-редиректы и склейку зеркал.

Мягкая 404: ошибка, которую не видно

Самая коварная ситуация с кодами — soft 404. Страница удалена, пользователь видит текст «Ничего не найдено», а сервер при этом отдаёт код 200. Для человека всё нормально, для робота — это полноценная существующая страница, которую надо индексировать. В итоге в индексе накапливаются десятки одинаковых «пустышек».

Как распознать мягкую 404 у себя:

  • Откройте заведомо несуществующий адрес: вашсайт.ru/qwerty12345.
  • Проверьте код ответа (способы — ниже). Должно быть 404, а не 200.
  • Проверьте страницы пустых результатов поиска по сайту и пустых фильтров каталога — там мягкие 404 живут чаще всего.
  • В Вебмастере загляните в «Страницы в поиске»: если там висят адреса с явно ошибочными путями — это оно.

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

Last-Modified и If-Modified-Since: как работает экономия

Теперь к главному. Механизм условных запросов устроен просто и элегантно.

Шаг 1. Робот первый раз запрашивает страницу. Сервер отдаёт код 200, содержимое и заголовок:

Last-Modified: Tue, 04 Aug 2026 09:15:00 GMT

Шаг 2. Робот запоминает эту дату. Через неделю он приходит снова, но запрашивает уже условно, добавляя свой заголовок:

If-Modified-Since: Tue, 04 Aug 2026 09:15:00 GMT

Шаг 3. Сервер сравнивает даты. Если страница не менялась — отдаёт короткий ответ 304 Not Modified вообще без тела документа. Робот не скачивает ни байта содержимого и переходит к следующему адресу.

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

Наглядно разница выглядит так:

ПоказательБез Last-ModifiedС корректным Last-Modified
Ответ на повторный запрос 200 + вся страница 304, тело не передаётся
Объём передачи одной страницы 50–300 КБ Меньше 1 КБ
Нагрузка на сервер Полная генерация страницы Сравнение двух дат
Страниц за один визит робота Условно 200 Условно 800–1500
Скорость попадания новых страниц в индекс Медленно Быстро

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

Главная ошибка: дата, которая всегда сегодняшняя

Неправильная настройка хуже отсутствующей. Типичный случай: движок формирует Last-Modified из текущего времени генерации страницы. Формально заголовок есть, фактически он сообщает роботу «страница только что изменилась» при каждом визите. Робот честно скачивает всё заново, а вы вдобавок теряете доверие к этому сигналу.

Корректная дата берётся из содержимого:

Тип страницыЧто считать датой изменения
Статья, новость Дата последней правки текста
Карточка товара Последнее изменение цены, наличия, описания
Категория каталога Последнее добавление или изменение товара внутри
Главная страница Последнее обновление любого выводимого блока
Статические страницы (о компании, контакты) Реальная дата правки, часто годичной давности — это нормально

Отдельная тонкость для интернет-магазинов: если на странице категории выводится блок «случайные товары» или счётчик просмотров, содержимое технически меняется при каждом обращении. Такие динамические блоки надо либо выносить в AJAX, либо исключать из расчёта даты — иначе Last-Modified снова станет бесполезным.

ETag: альтернатива по содержимому

У условных запросов есть второй механизм — ETag. Вместо даты сервер отдаёт «отпечаток» содержимого:

ETag: "a7f3c9e21b4d"

При следующем запросе клиент присылает If-None-Match с этим значением, сервер сравнивает отпечатки и при совпадении отвечает 304. Логика та же, но опирается не на дату, а на сам контент.

Что выбрать? Для HTML-страниц надёжнее Last-Modified: он понятнее, легче отлаживается и лучше отражает смысл «когда обновилось». ETag хорош для статики — картинок, стилей, скриптов — и обычно настраивается веб-сервером автоматически. Держать оба одновременно допустимо, но тогда важно, чтобы они не противоречили друг другу.

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

Как проверить свой сайт

Три способа, от самого простого к самому точному.

1. Инструмент Яндекс.Вебмастера

Раздел «Инструменты» → «Проверка ответа сервера». Вводите URL, выбираете робота Яндекса — получаете полный набор заголовков и код ответа. Там же можно указать дату для условного запроса и убедиться, что сервер отвечает 304. Это самый показательный тест, потому что он выполняется именно от лица робота. Остальные возможности раздела разобраны в гайде по Яндекс Вебмастеру.

2. Командная строка

Если есть доступ к терминалу, самый быстрый способ:

curl -I https://вашсайт.ru/stranica/

curl -I https://вашсайт.ru/stranica/ \
  -H "If-Modified-Since: Tue, 04 Aug 2026 09:15:00 GMT"

Первая команда покажет код и заголовки. Вторая должна вернуть HTTP/1.1 304 Not Modified, если страница с указанной даты не менялась.

3. Массовая проверка краулером

Десктопный парсер обходит сайт целиком и выгружает коды ответа и заголовки по всем страницам. Так находятся системные проблемы: раздел, который весь отдаёт 302, или тысяча страниц без Last-Modified. Подборка подходящих инструментов — в материале про инструменты SEO-специалиста.

Чек-лист корректной настройки

  1. Все рабочие страницы отдают 200. Не 200 с пустым телом, а именно рабочую страницу.
  2. Несуществующие адреса отдают 404, удалённый навсегда контент — 410.
  3. Все постоянные перенаправления — 301, а не 302.
  4. Цепочек редиректов нет: не более одного перехода от старого адреса к новому.
  5. На время техработ отдаётся 503 с Retry-After.
  6. Last-Modified присутствует на всех индексируемых страницах и берётся из реальной даты изменения контента.
  7. Сервер корректно обрабатывает If-Modified-Since и отвечает 304.
  8. Статика (CSS, JS, изображения) отдаётся с длинным Cache-Control и версионированием в имени файла.
  9. В логах доля ответов 5xx роботу — около нуля.

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

Что даёт правильная настройка на практике

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

Что былоЧто становится
Новый товар попадает в поиск за 2–4 недели За 2–5 дней
Обновлённый текст учитывается через месяц Через несколько дней
Робот обходит 15% каталога за визит Обходит 60–80%
Изменённые цены долго висят старыми в сниппете Обновляются быстро

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

Вывод

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

Плохая новость — сделать это своими силами получается редко: нужен доступ к серверу, понимание движка и опыт, чтобы не сломать кэширование в попытке его улучшить. Мы включаем эту настройку в базовый пакет внутренней оптимизации: проверяем ответы по всему сайту, находим мягкие 404 и цепочки редиректов, ставим корректный Last-Modified и контролируем результат по логам и статистике обхода. Загляните в кейсы, чтобы увидеть, как это отражается на сроках индексации, и напишите нам через контакты — проверим ответы вашего сервера бесплатно.

Закажите SEO-продвижение в SEO ПРОГРЕСС

20 лет опыта, 250+ успешных кейсов. Бесплатный аудит и консультация.

Получить консультацию

Комментарии

Станислав Ефимов

Проверил через Вебмастер — Last-Modified вообще не отдаётся. Движок самописный. Пойду к программисту с этой статьёй.

Оксана

У нас дата всегда текущая. То есть робот каждый раз качает сайт заново? Ужас.

Admin

Именно так. Формально заголовок есть, но он сообщает роботу «страница только что изменилась» при каждом визите, поэтому весь сайт скачивается заново. Это хуже, чем отсутствие заголовка: вы ещё и обесцениваете сигнал.

Николай Р.

Про 503 на время техработ — не знал вообще. Всегда просто выключали сайт и получали 404. Теперь понятно, почему после каждого обновления просадка.

Admin

Да, это прямая причина просадок после обновлений. На время работ отдавайте 503 с заголовком Retry-After — робот спокойно уйдёт и вернётся позже, ничего не потеряв. Пара строк в конфигурации решает проблему навсегда.

Татьяна

А если сайт на хостинге без доступа к настройкам сервера, Last-Modified вообще можно настроить?

Admin

Зависит от движка. На большинстве CMS заголовок формируется на уровне PHP, а не веб-сервера, поэтому доступ к конфигурации не нужен — достаточно правки в коде или подходящего плагина. На конструкторах вроде Тильды такой возможности нет вовсе.

Кирилл Жуков

Настроили условные запросы на магазине с 30 тысячами товаров. Число обходов в сутки выросло с 4 тысяч до 19 тысяч. Цифры из Вебмастера.

Милана

Мягкая 404 — прямо про наш поиск по сайту. Пустая выдача отдаёт 200 и красиво индексируется.

Егор

Разница между 404 и 410 — тонко, но логично. Буду использовать 410 для товаров, которые сняты навсегда.

Анна Соловьёва

У нас категория выводит блок «случайные товары», из-за этого дата меняется постоянно. Не подумали бы никогда.

Виталий

Вопрос: ETag и Last-Modified вместе не конфликтуют?

Admin

Не конфликтуют, если оба формируются корректно и не противоречат друг другу. Для HTML-страниц надёжнее опираться на Last-Modified, ETag хорошо работает для статики. Проблемы начинаются на нескольких серверах за балансировщиком, где ETag генерируется по-разному — там его лучше отключить.

Полина Гордеева

Таблица «что считать датой изменения» по типам страниц — то, чего не хватало в ТЗ разработчику. Скопировала целиком.

Руслан

Проверил curl'ом. Отдаёт 200 на условный запрос вместо 304. Есть над чем работать.

Дарья

Про цепочки редиректов тоже актуально. У нас четыре перехода от старого адреса к новому, накопилось за годы.

Admin

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

Оставить комментарий

Спасибо! Ваш комментарий отправлен на модерацию и появится после проверки.