HTTP заголовок Last-Modified (последние изменения) передает клиенту время последнего изменения документа (веб-страницы). Клиент (браузер или поисковый робот) отправляет серверу заголовок «If-Modified-Since» и если дата последнего изменения страницы совпадает, сервер возвращает заголовок «304 Not Modified» и не загружает страницу. Если время последнего изменения отличается (или last modified header не настроен) — сервер возвращает заголовок «200 OK» и загружает страницу. То есть вместо повторной перезагрузки страницы и обновления кеша, клиент получает всего лишь заголовок 304. Клиент экономит трафик, а сервер отдает меньше данных — обоюдная экономия.
Крупные поисковые системы рекомендуют вебмастерам использовать обработку заголовков для ускорения индексации или сокращения нагрузки.
Для того, чтобы отправить соответствующий заголовок с помощью 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);
Если вы работаете с системой 1С-Битрикс, то большинство компонентов, выводящих информацию из инфоблоков, умеют отдавать заголовок последней модификации, но 304-го статуса, к сожалению, не отдают.
Рассмотрим на примере: настроим отдачу 304-го статуса на страницах каталога
Итак, заходим в шаблона компонента, выводящего детальную карточку товара (catalog.element или news.detail). В файле result_modifier.php добавляем ключ кеширования TIMESTAMP_X:
$this->__component->arResultCacheKeys = array_merge($this->__component->arResultCacheKeys,
array('TIMESTAMP_X')
);
Теперь, в файле component_epilog.php добавляем код, проверяющий, дату сохранения элемента в кеш браузера и сверяем эту дату с датой последнего изменения товара:
$LastModified_unix = Bitrix\Main\Type\DateTime::createFromUserTime($arResult['TIMESTAMP_X']); // время последнего изменения страницы
$LastModified_unix=$LastModified_unix->getTimestamp();
// добавляем проверку на изменение файлов шаблона компонента:
$componentEpilogTimestamp = filectime(__FILE__);
$resultModifierTimestamp = filectime(str_replace('/component_epilog.php','/result_modifier.php',__FILE__));
$templateTimestamp = filectime(str_replace('/component_epilog.php','/template.php',__FILE__));
$LastModified_unix = max($LastModified_unix,$componentEpilogTimestamp,$resultModifierTimestamp,$templateTimestamp);
$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);
Как проверить?
Для проверки можно воспользоваться сервисом, или можно воспользоваться кодом:
$ch = curl_init(); $url = 'http://site.ru/1.php '; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'If-Modified-Since: Sun, 01 Sep 2001 17:33:22 GMT' )); ob_start(); curl_exec ($ch); curl_close ($ch); $data = ob_get_contents(); ob_end_clean(); echo nl2br($data);
Благодаря такой вот нехитрой штуке вы сможете увеличить ранжирование сайта в поисковых системах, т.к. поисковики не будут заниматься полной переиндексацией страниц сайта, а только тех, которые изменились со времени последнего захода, также это снизит нагрузку на трафик между сервером и браузером пользователя, что также положительно скажется на конечной цели сайта.
Если нужно определить дату последнего изменения статических файлов, то можно воспользоваться php-функцией:
getlastmod()
Результатом будет timestamp значние
Чтобы вывести на экран дату последнего изменения в читабельном виде:
echo "Последнее изменение: " . date ("F d Y H:i:s.", getlastmod()); 