If Modified Since

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

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

  • код 304 Not Modified- если не было изменений и тогда браузеру следует показать страницу из кэша не закачивая её сначала;
  • код 200 ОК – если страница была изменена и тогда её обновленная версия передается браузеру. Такой же ответ передается по умолчанию если отдача заголовка (сервером/движком сайта/страницей) настроена неправильно для того чтобы эта ошибка не мешала просмотру страницы.

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

  1. Экономия трафика.
  2. Ускорение загрузки страниц поскольку она загрыжается из локального кэша;
  3. Уменьшается нагрузка на сервер, особенно если сайт работает на сложной системе управления контентом.

Еще один значительный эффект – ускорение индексации новых страниц поисковыми системами. Поисковые роботы работают по такому же принципу как браузер но обходят сайты по своему графику и у них есть ограничения времени работы. Представьте себе ситуацию когда

  • на вашем сайте есть 1000 страниц
  • робот успевает обработать только 500 за один заход в случайном порядке
  • робот заходит раз в месяц
  • вы обновляете только 10 страниц в месяц

Получается что на первую индексацию уходит 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


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


Прочитано 69 раз

Общая оценка документа [показать форму]

страница еще не оценена