Использование Last Modified и If-Modified-Since

Для того, чтобы страница элемента отдавала ответ Last Modified или If-Modified-Since необходимо, во-первых, в файле result-modifier.php элемента добавить ключ даты последнего изменения 'TIMESTAMP_X', который должен кэшироваться при использовании встроенного кэширования компонента:

	$cp = $this->__component;
	$cp->arResult["timestamp"] = $arResult['TIMESTAMP_X'];
	$cp->SetResultCacheKeys(['OFFERS_IDS', 'OFFERS_PRICES', 'timestamp']);

Во-вторых, в файле component_epilog.php элемента осуществить проверку и записать соответствующее значение в переменную:

	GLOBAL $lastModified;
	 if (!$lastModified)
	     $lastModified = MakeTimeStamp($arResult['timestamp']);
	 else
	     $lastModified = max($lastModified, MakeTimeStamp($arResult['timestamp']));

 

Следующим шагом будет внесение в блок mod_rewrite.c файла .htaccess следующее правило:

	RewriteEngine On
	RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]
	RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]

Далее в файле init.php (если его нет, то необходимо его создать):

	AddEventHandler('main', 'OnEpilog', 'setLastModified');
	function setLastModified() {
	     GLOBAL $lastModified;
	     if ($lastModified)
	     {
	         header("Cache-Control: public");
	         header('Last-Modified: '.gmdate('D, d M Y H:i:s', $lastModified).' GMT');
	         if ( isset( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) && strtotime( $_SERVER['HTTP_IF_MODIFIED_SINCE'] ) >= $lastModified ) {
	             $protocol = (isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.1');
	             header( $protocol . ' 304 Not Modified' );
	         }
	     }
	}

Проверить, какой в результате приходит ответ, можно на странице https://webmaster.yandex.ru/tools/server-response/


Copyright ©2022