Давайте сегодня рассмотрим такой вопрос: что такое Last Modified и If-Modified-Since, зачем они нужен и как добавить их в WordPress.
Что такое Last Modified
Это один из ответов сервера при открытии любой страницы Вашего сайта. Он содержит в себе дату последнего изменения страницы в определенном Unix-формате.
Поисковые системы смотрят этот заголовок во время индексации перед тем, как скачать страницу и сравнивают с уже существующей записью у них. Если ничего не изменилось — поисковик пропускает страницу и переходит к следующей. Если есть изменения — он скачивает её заново и проверяет, что изменилось.
Что такое If-Modified-Since
Это заголовок, который посылает поисковая система, содержащий дату последней индексации страницы. Наш сайт на этот заголовок должен правильно среагировать — отдать правильный ответ. Если страница не была изменена за это время — дать ответ 304 Not Modified, который скажет поисковой системе, что страница не менялась и можно переходить к следующей. В случае, если страница была обновлена — отдать ответ 200 OK
Как же это влияет на индексацию?
Поисковик за раз может пройти только определенное количество страниц на Вашем сайте и, если он будет каждую выкачивать и проверять на изменения, лимит быстро закончится и часть страниц он просто не успеет проверить. В индекс попадет значительно меньше новых страниц, чем могло быть. Особенно это актуально тогда, когда количество страниц переходит за тысячу.
Если поисковик видит, что изменения не было — он просто пропускает страницу и сразу переходит к следующей.
- Таким образом он может за раз пройти больше страниц
- Объем новых страниц, попадающих в индекс, увеличивается
- Нагрузка на Ваш сайт снижается (т.к. поисковик не выкачивает страницы без изменений)
- Поисковик при сортировке результатов выдачи по дате начнет показывать Ваш сайт
Вот, что пишет у себя Яндекс по поводу Last Modified, если такой заголовок не отдается:
- в результатах поиска не будет показываться дата рядом со страницами вашего сайта;
- при сортировке по дате сайт не будет виден большинству пользователей
- робот не сможет получить информацию о том, обновилась ли страница сайта с момента последнего индексирования. А так как число страниц, получаемых роботом с сайта за один заход, ограничено, изменившиеся страницы будут переиндексироваться реже.
Вывод: отдавать заголовок Last Modified и правильный ответ на If-Modified-Since в крайней степени желательно, если Вы не хотите проблем с индексацией.
Проверить Ваш сайт можно по ссылке.
Как добавить Last Modified?
Интернет пестрит такого рода решениями:
header("Last-Modified: " . date('r',strtotime($post->post_modified)));
Или ковырянием в ядре движка. Оба варианта не подходят. Объясним почему.
Первый вариант предлагается добавлять в header.php. Какие здесь минусы:
- Это сработает только для записей и страниц, не будет работать для архивов (категорий, тегов, таксономий), для главной
- На всех страницах, кроме записей и страниц, переменная $post отсутствует, что тоже приведет к ошибке
- Если раньше заголовки уже отдались, это приведет к фатальной ошибке, необходима проверка
- Данный код нужно вызывать хуками, а не напрямую в коде
- Не учитывает добавленные комментарии
Второй вариант сразу отпадает и никогда таким не занимайтесь. Лезть в код ядра НЕЛЬЗЯ! При обновлении — все Ваши правки сотрутся.
Почему необходим If-Modified-Since?
При повторном посещении Вашего сайта поисковая система добавить к запросу заголовок If-Modified-Since и не получив ответа 304 Not Modified — она будет заново выкачивать страницу и сравнивать её. Одним Last-Modified не отделаться. Поисковик должен именно получить ответ на вопрос: «менялась ли страница с».
Как добавить If-Modified-Since
Для этого нужно смотреть наличие $_SERVER['HTTP_IF_MODIFIED_SINCE']
и сравнивать его с датой последнего изменения страницы. Если изменения были — отдать ответ 200, если изменений не было — отдать ответ 304.
Как проверить, работает ли у меня Last Modified?
Создайте у себя на хостинге файл с содержимым:
Откройте его в браузере и проверьте заголовки.
Где найти правильное рабочее решение?
Мы полностью переработали это решение, добавили различные проверки на ошибки, переписали код через хуки, добавили вывод не только для постов, но и для главной, для категорий, тегов, таксономий и всех остальных архивов. Добавили проверку на новые комментарии, они обновляют дату изменения.
И все это мы упаковали в одну из функций нашего плагина — Clearfy. Проверьте описание плагина — это настоящий комбайн полезных улучшений Вашего блога по минимальной цене.
Результат работы плагина Clearfy:
Это всё конечно хорошо, но толку от этого ноль, пока плагин If-Modified-Since обрабатывать не начнёт.
Спасибо! Принял, разберемся, добавим.
Обновили плагин, теперь он правильно обрабатывает If-Modified-Since
Я обычно делаю очень просто: как на своих обычных сайтах так и на дорвеях:
Перед доктайпом ставлю Ласт Модифайд который равен time*(), а в сайтмапе ставлю = сегодняшнему числу. Это я скажу очень сильно помогает. Например был проект один в индексе. Я добавил вот все это и через несколько дней индекс стал шире.
Здравствуйте! После включения функции «Отдавать ответ If-Modified-Since» перестал работать счетчик просмотров плагина «WP-PostViews».
Проблема была связана с тем, что браузер тоже видел ответ If-Modified-Since и показывал свою кешированную версию страницы. Сегодня в обновлении этот момент мы уже пофиксили — теперь авторизованным пользователям будет показываться как и раньше (с кодом 200), а для посетителей и поисковых систем будет 304 Not Modified.
Поставил плагин, проверил — вроде все работает. Посмотрим как повлияет на индексацию. у меня конечно меньше 1000 страниц в индексе.