Дата последнего изменения: 19.08.2021
Если вы обнаружили что страница перезаписывается не смотря на то, что динамический контент реально не изменился, то нужно проверить какие конкретно изменения вызывают необходимость перезаписи.
В папке кеша /bitrix/html_pages/<domain>/ файлы перед перезаписью копируются в файлы с расширением *.delete.<microtime>. В обычном режиме, если поменялось содержание страницы, то файлы в этой папке просто перезаписываются. С технологией Композитный сайт становится доступным просмотр того, что же изменилось на странице, что вызвало необходимость переписать кеш страницы.
Сами файлы композитного кеша лежат в отдельной папке со спецсимволом в имени. То есть странице www.site.ru/catalog/laptop/asus/fp5.php будет соответствовать файл /bitrix/html_pages/www.site.ru/catalog/laptop/asus/fp5@.htm.
Типовые причины перезаписи кеша, если:
$this->randString($len=6);.form[action], back_url и тому подобное), т.к. site.ru/folder/ и site.ru/folder/index.php - это один файл кеша. Если в динамической области есть компонент, который в ходе своей работы должен добавлять CSS, JS в <head> страницы по какому-то условию (например, по условию авторизован пользователь или нет), то такой компонент будет провоцировать постоянную перезапись кеша.
Проблема редкая, в обычном случае добавляется всегда.
В таком случае используйте метод Bitrix\Main\Page\AssetMode::setAssetMode. Этот метод всё что добавляется в head из этой динамической области вырезает (методы типа CMain::SetAdditionalCSS, CMain::AddHeadScript, CMain::ShowHeadStrings), не включает в кеш. Сведения для <head> приходят в данных динамической области и после выполнения ajax хита добавляются на страницу.
$dynamicArea = new \Bitrix\Main\Page\FrameStatic("workarea");
$dynamicArea->setAssetMode(AssetMode::STANDARD);
$dynamicArea->setStub("заглушка");
$dynamicArea->startDynamicArea();
// Компонент, в котором добавление ресурсов непостоянно и зависит от условий
$APPLICATION->includeComponent("mycompany:mycomponent", "template", array());
$dynamicArea->finishDynamicArea();
Если ajax-запрос завершился неудачей (проблемы с сетью, фатальная ошибка и так далее), то вы получаете страницу без контента динамических областей. Для корректировки такой ситуации используйте событие onFrameDataRequestFail. С его помощью можно исправить ситуацию, например, сделав редирект на страницу без композита.
BX.addCustomEvent("onFrameDataRequestFail", function(response) {
/*
response.error = true
response.reason - причина ошибки
[response.url] - адрес запрашиваемой страницы
[response.xhr] - объект XMLHttpRequest
[response.status] - код ответа сервера
[response.response] - ответ сервера
*/
window.location = "/some/url/?ncc=1";
});
В теге
есть блок php, который проверяет специальный Cookie Cookie - это текстовая строка информации, которую веб-сервер передает в браузер посетителя сайта и которая сохраняется в файле на устройстве посетителя сайта. Как правило, используется для определения уникальности посетителя, времени его последнего визита, личных настроек, уникального идентификатора корзины покупок и т.д.<style> с нужными стилями. Генерируется новая страничка, кеш перезаписывается. В таких случаях нужно вынести эту логику в Javascript.
<head>
<script>
if (document.cookie.indexOf("my_cookie=yes") >= 0)
{
//Устанавливаем класс для тега
document.documentElement.className += " has-cookie";
}
</script>
</head>
<style>
.block { display: none; }
.has-cookie .block { display: block; }
</style>