Last-Modified, которого нет: робот заново качает две тысячи неизменных страниц

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

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

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

Коротко

  • Сервер обязан отдавать заголовок Last-Modified — дату последнего изменения страницы в формате GMT.
  • Робот при повторном визите присылает встречный заголовок If-Modified-Since с той датой, которую запомнил.
  • Если страница не менялась, сервер отвечает 304 Not Modified — заголовки без тела страницы. Трафик не расходуется, обход дешевеет в разы.
  • Альтернатива дате — ETag (отпечаток содержимого) и встречный If-None-Match. Работают вместе или по отдельности.
  • Самая частая поломка — CMS подставляет в Last-Modified текущее время каждого запроса. Формально заголовок есть, пользы ноль.
  • На сайте до нескольких сотен страниц выигрыш почти не заметен. Смысл появляется от тысяч URL и на медленном сервере.

Почему робот вообще качает страницу, которая не менялась

Поисковый робот не хранит ваш сайт целиком. Он хранит адрес, содержимое последней копии и служебные метки — в том числе дату, которую вы ему сообщили. Когда подходит очередь адреса на переобход, робот делает обычный GET-запрос. Сервер отдаёт код 200 и весь HTML — тридцать, сто, двести килобайт. Робот сравнивает полученное с сохранённой копией, видит, что ничего не изменилось, и выбрасывает скачанное.

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

Теперь считаем. Сайт на 3000 страниц, средняя страница — 90 КБ HTML. Полный обход всего сайта — около 260 МБ, и почти всё это скачивание страниц, которые не менялись. Если сервер умеет отвечать 304, ответ на неизменённую страницу — это несколько сотен байт заголовков и, что важнее, отсутствие генерации: PHP не запускается, база не опрашивается, шаблон не собирается. Обход того же сайта из мегабайтов превращается в килобайты, а освободившееся время робот тратит на адреса, которые действительно новые.

Это та же логика, что и в истории про мусорные URL: робот не злонамеренный, он просто идёт по списку. Куда именно утекает его внимание на типовом сайте, я разбирал в статье почему Яндекс обходит мусорные URL чаще, чем важные страницы. Отсутствие Last-Modified — тот же слив, только незаметный: адреса-то правильные, лишними их не назовёшь.

Как устроен диалог: Last-Modified, If-Modified-Since и 304

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

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Last-Modified: Tue, 11 Mar 2026 09:14:22 GMT
Content-Length: 92418

Формат даты жёсткий: день недели, число, трёхбуквенный месяц по-английски, год, время и обязательная зона GMT. Никакого местного времени, никакого «+03:00» — только GMT. Робот запоминает эту строку вместе с адресом.

Второй визит, через неделю. Робот добавляет к запросу встречный заголовок:

GET /catalog/nasosy/ HTTP/1.1
Host: example.ru
If-Modified-Since: Tue, 11 Mar 2026 09:14:22 GMT

Сервер сравнивает эту дату с реальной датой изменения страницы. Если страница не менялась — отвечает без тела:

HTTP/1.1 304 Not Modified
Last-Modified: Tue, 11 Mar 2026 09:14:22 GMT

Всё. У ответа 304 не должно быть тела вообще — ни HTML, ни пробела. Робот понимает: копия актуальна, перекачивать нечего, идём дальше по очереди. Если же страница менялась, сервер игнорирует условие и отвечает обычным 200 с новым содержимым и новой датой.

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

ETag и If-None-Match: второй механизм

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

HTTP/1.1 200 OK
ETag: "a3f19c7b204e"
Last-Modified: Tue, 11 Mar 2026 09:14:22 GMT

При следующем визите робот присылает If-None-Match: "a3f19c7b204e". Сервер заново считает отпечаток, сравнивает со строкой из запроса и при совпадении отвечает тем же самым 304 Not Modified. Разница только в критерии сравнения: там дата, здесь — содержимое.

ETag бывает сильный и слабый. Слабый помечается префиксом W/ — например W/"a3f19c7b204e" — и означает «содержимое эквивалентно по смыслу, хотя байты могли отличаться». Для поисковых роботов разница непринципиальна, слабый ETag их устраивает.

Критерий Last-Modified + If-Modified-Since ETag + If-None-Match
Что сравнивается Дата изменения Отпечаток содержимого
Точность До секунды: правка в ту же секунду будет пропущена Побайтная, ловит любое изменение
Нагрузка на сервер Минимальная: сравнили два числа Выше: чтобы посчитать отпечаток, страницу надо сгенерировать
Понятность при отладке Видно глазами, когда менялась страница Строка ничего не говорит человеку
Где уместен Динамические страницы CMS, где есть поле «дата изменения» Статика: картинки, CSS, JS, PDF — их отдаёт веб-сервер сам
Риск Дата «врёт», если её подставляет кэш или сама CMS Ломается при сжатии на лету и при работе с нескольких серверов

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

Отдельная ловушка с ETag на Apache: модуль сжатия mod_deflate дописывает к метке суффикс -gzip. Робот сохранил метку без суффикса, вернул её в If-None-Match, сервер сравнил с версией с суффиксом и не нашёл совпадения — и вместо 304 приходит 200 с полным телом. Механизм формально включён, а работает вхолостую. Поэтому проверять надо не наличие заголовка, а фактический код ответа на условный запрос.

Что отдаёт сервер сейчас, что должен и как проверить за пять минут

Сначала общая карта: что смотреть, какая норма и чем именно это измеряется. Дальше — по шагам, с командами.

Что смотрим Типичная ситуация Как должно быть Чем проверить
Заголовок Last-Modified на странице записи Отсутствует Есть, дата = дата последней правки записи curl -sI URL | grep -i last-modified
Стабильность даты Меняется при каждой перезагрузке Одна и та же при пяти запросах подряд Пять раз тот же curl, сравнить строки
Ответ на If-Modified-Since с текущей датой 200 OK и полный HTML 304 Not Modified curl -sI -H "If-Modified-Since: ..." URL
Ответ на If-Modified-Since со старой датой 200 OK с новым телом Тот же запрос с датой годичной давности
Тело ответа 304 Иногда прилетает HTML Пусто, ноль байт curl -s -H "If-Modified-Since: ..." URL | wc -c
ETag на статике (CSS, картинки) Обычно есть Есть и стабильный между запросами curl -sI /файл.css | grep -i etag
Реакция на изменение страницы Дата не двигается после правки Дата обновилась, ответ снова 200 Правка текста → повтор проверки
Ответ 304 у робота Яндекса Не проверяли ни разу Совпадает с проверкой curl Вебмастер → Инструменты → Проверка ответа сервера

Первый шаг — узнать, что сервер отдаёт вообще. В терминале (на macOS и Linux он есть из коробки, на Windows подойдёт встроенный curl из PowerShell):

curl -sI https://example.ru/catalog/nasosy/

В выводе ищем строку Last-Modified. Если её нет — механизм не работает, потому что роботу нечего запоминать и нечего прислать обратно. Если она есть, копируем значение и делаем условный запрос:

curl -sI -H "If-Modified-Since: Tue, 11 Mar 2026 09:14:22 GMT" \
  https://example.ru/catalog/nasosy/

Правильный ответ — первая строка HTTP/1.1 304 Not Modified или HTTP/2 304. Если пришло 200 OK, значит сервер получил условие и проигнорировал его: заголовок для галочки есть, экономии нет.

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

Третий шаг — контрольный запрос со старой датой. Подставляем дату годичной давности и ждём код 200 с полным телом. Если и на неё сервер отвечает 304, у вас обратная поломка: робот никогда не увидит обновлений страницы, потому что сервер всегда рапортует «не менялось».

Четвёртый шаг — глазами робота Яндекса. В Вебмастере есть раздел «Инструменты» → «Проверка ответа сервера». Вставляете адрес, выбираете нужного робота и получаете полный список заголовков ответа именно для него. Смотреть там надо три вещи: код ответа, наличие строки Last-Modified и её значение. Инструмент полезен ещё и тем, что показывает ответ на реальный запрос от инфраструктуры Яндекса — если у вас настроена отдача разного контента по User-Agent или стоит защита от ботов, отличия сразу вылезут. Про расхождения между тем, что видите вы и что видит робот, я подробно писал в материале Google и Яндекс видят ваш сайт по-разному.

Пятый шаг для тех, у кого есть доступ к серверу, — логи. В них видно, сколько ответов 200 и 304 реально получил робот за сутки и на каких адресах. Это единственный способ увидеть не гипотезу, а факт. Что ещё вытаскивается из логов, я собрал в статье логи сервера в SEO: что в них видит робот. После настройки 304 доля таких ответов в логах по старым разделам должна заметно вырасти — это и есть измеримый результат работы.

Пять типичных поломок и что с ними делать

Симптом Что происходит на самом деле Что делать
Дата в Last-Modified разная при каждом запросе CMS или плагин пишут gmdate() текущего момента вместо даты правки записи Привязать значение к полю даты изменения записи в базе
Заголовок есть, но на If-Modified-Since приходит 200 Сервер отдаёт дату, но не читает встречный заголовок — обработчика условия просто нет Добавить сравнение и явную отдачу 304 с выходом до генерации страницы
Дата прыгает после чистки кэша Значение берётся из времени файла кэша, а не из даты контента Отвязать от кэша: источник даты — запись в базе
В ответе 304 приходит тело страницы Код выставлен через http_response_code(), но выполнение не остановлено После отправки заголовков — немедленный exit
На статике 304 не отдаётся при включённом сжатии Apache дописывает -gzip к ETag, метки перестают совпадать Опираться на Last-Modified или убрать суффикс в конфиге
Разные ETag с разных серверов балансировщика Метка считается от inode файла, а он на каждой машине свой Считать ETag только от размера и времени, либо отключить и оставить дату

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

Что делать на WordPress

Из коробки WordPress обрабатывает условные запросы для RSS-лент и для файлов, которые отдаёт веб-сервер напрямую. Для обычных HTML-страниц — записей, рубрик, главной — заголовка Last-Modified в ответе чаще всего нет. Причина не в халатности разработчиков, а в осторожности: движок не может знать, что вы выводите в шаблоне. Виджет «последние комментарии», случайные товары, счётчик просмотров, персонализация по региону — всё это меняет страницу без изменения самой записи, и универсально угадать дату нельзя. Поэтому решение отдано на откуп сайту.

Правильный источник даты для записи или страницы — поле post_modified_gmt, то самое, которое WordPress пишет при каждом сохранении. Забирается оно функцией get_post_modified_time(). Минимальный рабочий вариант выглядит так — в файл темы functions.php или, что надёжнее, в отдельный mu-плагин:

add_action('template_redirect', function () {
    if (is_admin() || is_user_logged_in() || !is_singular()) {
        return;
    }
    if (is_preview() || post_password_required()) {
        return;
    }

    $ts = get_post_modified_time('U', true);
    if (!$ts) {
        return;
    }

    // если под записью есть комментарии, дата последнего из них тоже двигает страницу
    $last_comment = get_comments(array(
        'post_id' => get_the_ID(),
        'status'  => 'approve',
        'number'  => 1,
        'orderby' => 'comment_date_gmt',
        'order'   => 'DESC',
    ));
    if (!empty($last_comment)) {
        $ts = max($ts, strtotime($last_comment[0]->comment_date_gmt . ' GMT'));
    }

    header('Last-Modified: ' . gmdate('D, d M Y H:i:s', $ts) . ' GMT');

    $ims = !empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])
        ? strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])
        : 0;

    if ($ims && $ims >= $ts) {
        header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified', true, 304);
        exit;
    }
});

Что здесь важно и почему именно так:

  • template_redirect — момент, когда WordPress уже определил, какую страницу показывает, но ещё не начал выводить HTML. Раньше нельзя — не знаем запись; позже нельзя — заголовки уже ушли.
  • Проверка is_user_logged_in() нужна, чтобы вы сами в админ-баре не ловили 304 и не думали, что сайт сломался.
  • exit после отправки 304 обязателен. Без него PHP продолжит работу и допишет к пустому ответу весь HTML — получится 304 с телом, а это уже нарушение протокола, и робот может отреагировать непредсказуемо.
  • Для архивов, рубрик и главной эту логику надо расширять: там дата — это максимум из дат изменения всех выведенных на странице записей. Отдельная выборка, отдельный код.

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

Как это связано с попаданием новых страниц в индекс

Лимит обхода — это в первую очередь время, которое робот готов потратить на ваш сервер. Оно не выдаётся раз и навсегда: чем быстрее сервер отвечает и чем меньше ошибок, тем охотнее робот увеличивает нагрузку. И тут 304 работает сразу с двух сторон.

Первое — прямая экономия. Ответ 304 обходится серверу в доли миллисекунды: не поднимается PHP, не идут запросы в базу, не собирается шаблон. Сравните с полной генерацией страницы каталога, которая на средненьком хостинге занимает 300–800 мс. Разница в сотни раз. Второе — косвенный выигрыш: средняя скорость ответа по сайту падает, а от неё напрямую зависит, сколько запросов в секунду робот себе позволит. Про то, откуда вообще берётся секунда до первого байта, я писал в статье хостинг быстрый, а сайт тормозит: куда исчезает секунда до первого байта.

Показатель Без Last-Modified С корректным Last-Modified и 304
Ответ на неизменённую страницу 200 + полный HTML (десятки—сотни КБ) 304, несколько сотен байт заголовков
Работа сервера Полная генерация: PHP, база, шаблон Сравнение двух чисел, выход до генерации
Куда уходит лимит обхода На повторное скачивание старых разделов На новые и обновлённые адреса
Реакция на новую страницу Может ждать несколько недель в очереди Очередь короче, до новых URL доходит быстрее
Нагрузка на хостинг от роботов Заметная, особенно на больших каталогах Падает пропорционально доле неизменных страниц

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

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

Когда возиться не стоит

Сайт-визитка на 40 страниц. Робот обходит его целиком за один заход и приходит снова через день-два. Экономить тут нечего: даже если каждая страница качается заново, это меньше четырёх мегабайт в месяц и никакой очереди. Здесь ваш ресурс лучше потратить на скорость первой отрисовки и на контент.

Сайт на конструкторе. На Тильде, Wix и подобных платформах вы не управляете заголовками ответа — их формирует платформа, и точка. Единственное, что можно сделать, — проверить curl, что там отдаётся, и учитывать это как данность. Проверить, конечно, стоит — вдруг платформа всё делает правильно, — но повлиять на результат вы не сможете.

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

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

И последнее: не начинайте с 304, если у вас в Вебмастере висят ошибки 5xx или сервер регулярно отваливается. Сначала стабильность, потом оптимизация: на сервере, который через раз отдаёт 502, вопрос лишних скачиваний вообще не первый по важности. Если непонятно, в каком состоянии техническая часть вашего сайта прямо сейчас, начните с бесплатного аудита сайта — по заголовкам ответа сразу видно, есть ли смысл этим заниматься.

Финальный чеклист

Что делаем Норма
1 curl -sI по типовой странице записи Есть строка Last-Modified с датой в GMT
2 Пять одинаковых запросов подряд Дата во всех пяти ответах одна и та же
3 Условный запрос с этой же датой Код 304 Not Modified
4 Условный запрос с датой годичной давности Код 200 и полное тело страницы
5 Размер тела при ответе 304 Ноль байт
6 Правим текст записи и повторяем шаг 3 Дата обновилась, снова приходит 200
7 Проверяем все типы шаблонов Запись, страница, рубрика, пагинация, товар — везде корректно
8 Проверяем страницу 404 Код 404, никаких 304 и никаких дат
9 Вебмастер → Инструменты → Проверка ответа сервера Робот видит то же, что и curl
10 Заходим на сайт залогиненным Видим свежую страницу, а не 304
11 Сбрасываем кэш и проверяем дату заново Дата не изменилась — она берётся из базы, а не из кэша
12 Через две недели смотрим логи сервера Доля ответов 304 роботу по старым разделам заметно выросла

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

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

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

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

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

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

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

Комментарии

Игорь

Проверил свой интернет-магазин через curl — Last-Modified вообще нет ни на одной странице. Битрикс. Это нормально или у меня что-то сломано?

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

Ничего не сломано, это поведение по умолчанию для большинства динамических CMS. Заголовок надо включать осознанно и привязывать к дате изменения элемента. Начните с одного раздела каталога, проверьте пункты 1–5 из чеклиста и только потом раскатывайте на весь сайт.

Марина

Спасибо, наконец-то понятно, зачем нужен этот 304. Уточните, пожалуйста: если я поставлю дату изменения записи, а у меня под статьями комментарии — робот же не увидит новые комментарии?

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

Именно поэтому в коде из статьи дата берётся как максимум из двух: даты правки записи и даты последнего одобренного комментария. Новый комментарий двигает дату, робот получает 200 и перекачивает страницу. Без этой части у вас были бы вечные 304 на страницах с обсуждениями.

Дмитрий Л.

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

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

Это не альтернативы, это разные слои. robots.txt говорит, какие адреса не обходить вовсе. Last-Modified работает с теми, которые обходить надо, но перекачивать незачем. На сайте из 200 страниц вы правы — погрешность. На каталоге из 30 тысяч разница видна в логах уже на второй неделе, и это не оценка на глаз, а доля ответов 304.

Сергей

А если поставить ETag вместо Last-Modified, разве не проще? Сервер сам посчитает, ничего к базе привязывать не надо.

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

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

Алексей

Вставил код в functions.php, теперь на сайте вижу белый экран после сохранения статьи. Что не так?

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

Скорее всего сработал exit там, где он не должен был: проверьте, что стоит условие на залогиненного пользователя и на превью. И убедитесь, что перед функцией нет пустой строки после закрывающего тега PHP — при выводе хотя бы одного лишнего символа заголовки уже отправлены, и header() отработает вхолостую.

Ольга

Проверила через Вебмастер, там Last-Modified показывается, а через curl из терминала — нет. Как так вообще может быть?

Виктор

У нас за сайтом стоит CDN. Он тоже отдаёт свои заголовки. Не подерётся с тем, что отдаёт сервер?

Никита

Полезная штука. Добавлю от себя: у нас на Apache ETag с суффиксом -gzip реально ломал всё, две недели искали. Хорошо, что в статье про это написано.

Татьяна

Подскажите новичку: где вообще брать этот терминал и не сломаю ли я сайт, если начну слать запросы curl?

Роман

Сайт-каталог, 8 тысяч позиций. В логах вижу, что робот качает одни и те же карточки товаров по три раза в неделю, хотя они не менялись год. Вот прямо про меня статья.

Павел

А как быть со страницами пагинации? Там же содержимое меняется, когда добавляешь товар в категорию. Дату брать по самому свежему товару на конкретной странице?

Юлия

Сделала всё по чеклисту, дошла до пункта 11 — после сброса кэша дата поехала. Значит, беру её из кэша, а не из базы. Спасибо, без этого пункта бы не заметила.

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