If-modified-since

1516
20.04.2017
15.05.2017

Для сео-оптимизации часто требуется отдавать 304-й статус страницы, если страницы не менялась с предыдущего захода поисковика. Для этого нам поможет проверка If-Modified-Since

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();

$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());

Источник: http://last-modified.com/ru/last-modified-if-modified-since-php.html


Благодарю за внимание! Делитесь вашими замечаниями в комментариях ниже.


P.S. Обращайтесь ко мне за приобретением лицензий и продлений на 1C-Битрикс "Управление сайтом", лицензий на облачную и коробочную версии Битрикс 24 а также за приобретением и внедрением готовых решений на базе 1С-Битрикс от партнеров. За более подробной информацией свяжитесь со мной любым удобным для вас способом


Комментарии

Еще никто не комментировал данную публикацию. Будьте первыми!

Добавить комментарий

captcha

Возврат к списку