Для того, чтобы страница элемента отдавала ответ 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/