Дата последнего изменения: 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>