If-modified-since

Для сео-оптимизации часто требуется отдавать 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();

// добавляем проверку на изменение файлов шаблона компонента:

$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());
Количество показов: 5683
20.04.2017

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

Если вам была полезна статья можете отблагодарить автора:
Ethereum:

0x16Df809287333C49D3A237296C6248A6c08702Bc

Разработка сайта

Подайте заявку на разработку сайта на базе готового решения от компании 1С-Битрикс или одного из партнеров компании. Максимально подробно опишите, чему будет посвящен сайт, если это интернет-магазин - что он будет продавать, нужна ли мультиязычность, будут ли разные типы цен (розница, опт, крупный опт), будет ли интеграция с 1С, будет ли выгрузка товаров на различные торговые площадки...

Сопровождение сайта

Вы можете подать заявку на сопровождение вашего сайта на базе 1С-Битрикс. Сопровождение включает в себя: проверка актуальности обновлений сайта, проверка актуальности резервной копии, консультации по сайту. Опишите в заявке, какие еще объемы планируются на сопровождении и на какой срок вы планируете заключить договор на сопровождение - мы подберем подходящий вам бюджет на сопровождение

Работы по сайту

Вы можете подать заявку на выполнение определенного объема работ по сайту. Опишите в заявке объем работ. Это может быть разработка какого-то нового функционала, доработки по имеющемуся функционалу, доработки под требования сео-специалистов. На основании заявки вам будет сформирован бюджет работ, а также названы сроки на выполнение тех или иных работ.