If Modified Since
Что это и на что влияет ?
HTTP заголовки Last-Modified и If-Modified-Since предназначены для передачи даты и времени последнего изменения страницы.При первом обращении к серверу клиент (браузер, поисковый робот) получает заголовок Last-Modified содержащий дату и время документа и записывает их в кэш. При повторном заходе на эту же страницу (например через неделю) браузер сначала считывает из кэша имеющиеся данные и запрашивает сервер заголовком If-Modified-Since была ли изменена страница со времени его посещения (неделю назад). Сервер проверяет страницу и в ответ передает
- код 304 Not Modified- если не было изменений и тогда браузеру следует показать страницу из кэша не закачивая её сначала;
- код 200 ОК – если страница была изменена и тогда её обновленная версия передается браузеру. Такой же ответ передается по умолчанию если отдача заголовка (сервером/движком сайта/страницей) настроена неправильно для того чтобы эта ошибка не мешала просмотру страницы.
При правильной передаче ответа на запрос If-Modified-Since от сервера к браузеру передаются только измененные страницы. За счет этого получаем следующие эффекты:
- Экономия трафика.
- Ускорение загрузки страниц поскольку она загрыжается из локального кэша;
- Уменьшается нагрузка на сервер, особенно если сайт работает на сложной системе управления контентом.
Еще один значительный эффект – ускорение индексации новых страниц поисковыми системами. Поисковые роботы работают по такому же принципу как браузер но обходят сайты по своему графику и у них есть ограничения времени работы. Представьте себе ситуацию когда
- на вашем сайте есть 1000 страниц
- робот успевает обработать только 500 за один заход в случайном порядке
- робот заходит раз в месяц
- вы обновляете только 10 страниц в месяц
Об этом же говорят рекомендации Яндекса :
Следите за корректностью HTTP-заголовков. В частности, важно содержание ответа, который сервер отдает на запрос «if-modified-since». Заголовок Last-Modified должен отдавать корректную дату последнего изменения документа.
и Google :
Make sure that your web server correctly supports the If-Modified-Since HTTP header. This feature directs your web server to tell Google if your content has changed since we last crawled your site. Supporting this feature saves you bandwidth and overhead.
Как проверить ?
Проверку правильной передачи сайту заголовка If-Modified-Since можно провести на сайтах :Last-Modified.com – быстрая проверка, на русском. Просто впишите адрес страницы и из полученного ответа будет понятно все ли в порядке. Проверка заключается в отправке двух последовательных запросов на указанную страницу. Первый получит ответ 200 OK с датой и временем изменения страницы в заголовке Last-Modified. Второй запрос If-Modified-Since ( «а изменилась ли запрашиваемая страница со времени Last-Modified ? т.е. несколько секунд назад ?") Если будет получен ответ 304 то все отлично, качать всю страницу заново не надо. Если же опять будет получен ответ 200 OK то у нас проблема которую лучше исправить.
Вот результат проверки данного сайта :

Аналогичную проверку можно выполнить на сайте Bertal.ru.
А если вы зарегистрировали ваш сайт в Яндекс. вебмастере то проверку можно сделать имеющимся там инструментом.
https://webmaster.yandex.ru/tools/server-response/
Как исправить ?
Поскольку наш сайт работает на PHP можем воспользоваться решением предложенным на том же сайте Last-Modified.comОтправляем HTTP заголовок Last-Modified с помощью php
<?php $LastModified_unix = 1294844676; // время последнего изменения страницы $LastModified = gmdate("D, d M Y H:i:s \G\M\T", $LastModified_unix); $IfModifiedSince = false; if (isset($_ENV['HTTP_IF_MODIFIED_SINCE'])) $IfModifiedSince = strtotime(substr($_ENV['HTTP_IF_MODIFIED_SINCE'], 5)); if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) $IfModifiedSince = strtotime(substr($_SERVER['HTTP_IF_MODIFIED_SINCE'], 5)); if ($IfModifiedSince && $IfModifiedSince >= $LastModified_unix) { header($_SERVER['SERVER_PROTOCOL'] . ' 304 Not Modified'); exit; } header('Last-Modified: '. $LastModified); ?>
Все просто – получаем время последнего изменения страницы, проверяем наличие If-Modified-Since, если есть – отдаем 304 Not Modified и останавливаем работу скрипта, иначе генерируем заголовок Last-Modified и отдаем страницу.
Этот код прямо как есть я вставляю в самое начало файла \theme\_common\_header.php и теперь он будет действовать для каждой страницы сайта.
Результат повторной проверки после исправления

Задача выполнена успешно.
Если на вашем сайте обнаружится такая же ошибка то решение наверняка найдется, Яндекс с Гуглом в помощь.
Прочитано 2 149 раз