CompoWiki: If Modified Since

https://wiki.compowiki.info     Редакция: 2019-07-17 20:04:53

If Modified Since

Что это и на что влияет ?

HTTP заголовки Last-Modified и If-Modified-Since предназначены для передачи даты и времени последнего изменения страницы.
При первом обращении к серверу клиент (браузер, поисковый робот) получает заголовок Last-Modified содержащий дату и время документа и записывает их в кэш. При повторном заходе на эту же страницу (например через неделю) браузер сначала считывает из кэша имеющиеся данные и запрашивает сервер заголовком If-Modified-Since была ли изменена страница со времени его посещения (неделю назад). Сервер проверяет страницу и в ответ передает

При правильной передаче ответа на запрос If-Modified-Since от сервера к браузеру передаются только измененные страницы. За счет этого получаем следующие эффекты:
  1. Экономия трафика.
  2. Ускорение загрузки страниц поскольку она загрыжается из локального кэша;
  3. Уменьшается нагрузка на сервер, особенно если сайт работает на сложной системе управления контентом.

Еще один значительный эффект – ускорение индексации новых страниц поисковыми системами. Поисковые роботы работают по такому же принципу как браузер но обходят сайты по своему графику и у них есть ограничения времени работы. Представьте себе ситуацию когда
Получается что на первую индексацию уходит 2 месяца в лучшем случае. Если же сайт неправильно отвечает на запрос If-Modified-Since то 10 новых страниц проиндексируются очень не скоро, если вообще до них дойдет очередь. А если все настроено как положено то при очередном заходе робот почти не потратит время на 990 неизмененных страницах и успеет проиндексировать 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 то у нас проблема которую лучше исправить.
Вот результат проверки данного сайта :

checked If-Modified-Since not works

Аналогичную проверку можно выполнить на сайте 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 и теперь он будет действовать для каждой страницы сайта.
Результат повторной проверки после исправления

checked If-Modified-Since works

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

Прочитано 2 149 раз