Композитный сайт
- Как работает технология
- Как включить композитный сайт
- Какой режим выбрать
- Как настроить композитный сайт
- Префикс файлов cookies
- Как проверить работу композитного сайта
- Как выполнить отладку композитного сайта
- Как адаптировать переменные
- Как работать с динамическими зонами
- Как работать с JS в Композитном сайте
- Заголовки и 304 ответ
- Как обработать неудачный запрос
- Частая перезапись кеша
- Как сбросить кеш
- Особенности работы с кешем
- Композит в системах аналитики
Композитный сайт — это технология, которая ускоряет загрузку страниц и делает отображение контента гибким. Она работает как дополнительный уровень кеширования в Bitrix Framework.
Технология не конфликтует с другими механизмами кеширования. Она применяется после них, чтобы ускорить загрузку страниц за счет времени ответа сервера.
Как работает технология
Композитный сайт разделяет статический и динамический контент. Динамический контент — это данные, которые:
-
часто обновляются,
-
зависят от прав пользователя,
-
уникальны для каждого запроса.
Например, корзина интернет-магазина обновляется при добавлении товаров и показывает персональные скидки для каждого покупателя.
Статический контент загружается сразу, а динамический — отдельным AJAX-запросом.
Алгоритм работы без композитного сайта
-
Сервер получает запрос.
-
Проверяет права пользователя.
-
Выполняет PHP-скрипты компонентов.
-
Формирует HTML-код и отдает его браузеру.
В результате время загрузки страницы может достигать нескольких секунд.

Алгоритм работы с композитным сайтом
-
Разметка зон. В шаблонах компонентов динамические зоны выделяют методом
$this->createFrame(), который возвращает объект с методамиbegin()иend(). Система формирует служебные границы зоныbxdynamic_*. В режиме Автокомпозит зоны могут создаваться автоматически. -
Первичный запрос. При первом запросе сервер создает кеш статической части страницы и добавляет JavaScript для загрузки динамического контента.
-
Последующие запросы. Сервер отдает кеш, а затем загружает динамический контент. JavaScript отправляет запрос на сервер, чтобы получить динамический контент, и вставляет его в нужные места на странице.
Для первого пользователя:
-
Сервер формирует страницу как обычно.
-
Сохраняет статическую часть в кеш.
-
Добавляет JavaScript для загрузки динамического контента.
Для последующих пользователей:
-
Сервер отдает кеш.
-
JavaScript загружает динамический контент в фоновом режиме.
В результате время загрузки страницы значительно сокращается благодаря кешированию статического контента, особенно для последующих пользователей. Динамический контент подгружается дольше, но пользователь этого не замечает.

Как включить композитный сайт
Чтобы включить технологию Композитный сайт, настройте продукт и окружение.
В административном разделе продукта откройте страницу Настройки > Настройки продукта > Композитный сайт.
-
Выберите режим работы: Автокомпозит или Композит.
-
Нажмите кнопку включения на соответствующей вкладке.
-
Перед включением очистите кеш компонентов.
Для работы технологии необходимо настроить NGINX. NGINX — это веб-сервер, который обрабатывает запросы к вашему сайту. Настройки зависят от окружения.
-
Виртуальная машина BitrixVM — настройте NGINX через пункт меню 8. Configure pool sites > 6. Configure nginx to use composite cache.
-
Другое окружение — настройте NGINX для окружения вручную.
Установка 1С-Битрикс: Управление сайтом и коробочной версии Битрикс24 на другие окружения
Какой режим выбрать
-
Автокомпозит. Подходит для простых сайтов. В этом режиме система автоматически настраивает параметры, что экономит время разработки.
-
Композит. Ручная настройка рекомендуется для сложных проектов с кастомизированными компонентами. Автоматика может не учесть особенности вашего проекта, поэтому ручная настройка обеспечивает более гибкое управление.
Автокомпозит
При выборе режима Автокомпозит система автоматически назначает следующие параметры:
-
Голосование шаблона компонента по умолчанию — «за».
-
Содержимое компонента — автоматически формируемая динамическая область с заглушкой.
-
Режим перезаписи кеша — стандартный с задержкой.
Если сайт был настроен на ручной Композит, после включения Автокомпозита ранее адаптированные шаблоны и компоненты продолжают работать как раньше.
Чтобы проверить работу Автокомпозита:
-
Откройте сайт в режиме инкогнито как анонимный пользователь.
-
Зайдите на одну и ту же страницу несколько раз, чтобы проверить работу кеша.
-
Проверьте типовые сценарии пользователей. Убедитесь, что все страницы и компоненты работают корректно.
-
Измените параметры работы компонента в настройках компонента, если нужно. В компонентах доступно больше вариантов заглушек, чем в глобальных настройках.
В режиме Автокомпозит для разметки динамических областей используются невидимые теги вместо div-контейнера. Теги не влияют на верстку.
// разметка до включения Автокомпозита
<div id="bxdynamic_area_id">
Контент заглушки
</div>
// разметка после включения Автокомпозита
<div id="bxdynamic_area_id_start" style="display:none"></div>
Контент заглушки
<div id="bxdynamic_area_id_end" style="display:none"></div>
Если компонент не работает в Автокомпозите
-
Проверьте инициализацию кода на событие
DOMContentLoaded. ПеренеситеBX.readyили$.readyв динамическую область. -
Проверьте Обработчики глобальных событий браузера.
-
Проверьте обращения к DOM из динамической области. В Автокомпозите вместо общего контейнера используются границы
_startи_end. Для своего JavaScript добавьте элемент с отдельнымidвнутри области и обращайтесь к нему после вставки динамического контента. Сам методinsertAdjacentHTMLне запрещен: его использует и композитный JavaScript.
Композит
В этом режиме можно настраивать глобальные параметры.
-
Голосование компонентов — определяет, какие компоненты будут обновляться динамически.
-
Тип заглушки для динамических зон — временный контент, который показывает система во время загрузки динамической части.
Страницы, которые зависят от действий пользователя и часто обновляются, не стоит кешировать. Например, рекомендуем оставить динамическими:
-
страницу поиска, компонент
bitrix:search.page, -
корзину с оформлением, компонент
bitrix:sale.basket.order.ajax, -
страницу оформления заказа, компонент
bitrix:sale.order.ajax.
Как настроить композитный сайт
Настроить композитный сайт можно в административном разделе продукта на странице Настройки > Настройки продукта > Композитный сайт, вкладка Настройки.

Файл настроек .config.php находится в папке /bitrix/html_pages/. Не редактируйте его вручную — изменения будут перезаписаны при сохранении настроек через интерфейс.
Голосование за композитный режим
Настройка доступна только для режима Композит. Определяет, какие компоненты будут обновляться динамически.
-
За — все компоненты по умолчанию будут обновляться динамически.
-
Против — включите вручную обновление в нужных компонентах.
Данные этого параметра можно переопределить в настройках компонента.
Режим перезаписи кеша
Выберите один из трех способов обновления кеша:
-
С задержкой. Снижает нагрузку на систему, распределяя процесс обновления кеша во времени.
-
Без задержки. Кеш обновляется сразу после изменения данных.
-
Без фонового AJAX-запроса (HTML-кеширование). После получения страницы клиентом, JS-скрипт сравнивает дату изменения кеша с временем пользователя. Если разница превышает установленное значение, кеш перезаписывается. Рекомендуется для страниц с высокой посещаемостью, таких как лендинги или сайты-визитки. Только для режима Композит.
Управлять режимом можно через API.
$composite = \Bitrix\Main\Page\Frame::getInstance();
// Отключаем AJAX-запрос
$composite->setAutoUpdate(false);
// Устанавливаем время обновления кеша — 60 секунд
$composite->setAutoUpdateTTL(60);
Настройки
Включение технологии по сайтам
Чтобы включить технологию для конкретных сайтов укажите доменные имена в поле Список доменных имен. Проверка домена выполняется по полному совпадению. Убедитесь, что в списке указаны все варианты домена, с www и без.
Не удаляйте номер порта из доменного имени, если сайт работает на 1С-Битрикс: Веб-окружение.
Игнорирование параметров URL
Для страниц с разными параметрами можно создать единый кеш. Это уменьшает его размер. Параметры указываются в поле Игнорировать следующие параметры URL.
Например, пользователь открывает страницу: /index.php?event1=download&event2=bsm_API. Если добавить параметры event1 и event2 в исключения, отдельный кеш для такой страницы система создавать не будет, только для /index.php.
Службы Веб-аналитика, Google Аналитика и Яндекс Метрика будут корректно работать с такими кешированными страницами.
Сохранение кеша только для страниц без параметров
Опция Сохранять на диск только страницы без параметров включит создание кеша только для страниц с ЧПУ (человекопонятный URL). Для страниц с параметрами кеш не создастся, например, для постраничной навигации.
Добавить в исключение некоторые параметры можно в поле А также страницы, содержащие только следующие параметры.
Механизм хранения кеша
Файлы. Укажите объем места для хранения кеша в поле Дисковая квота.
-
В файлах можно хранить большой объем. При достижении лимита старый кеш автоматически удаляется по алгоритму LRU (Least Recently Used).
-
Кеш сохраняется после перезагрузки сервера.
-
Работает медленнее, чем кеш в оперативной памяти.
Оперативная память (memcached). Укажите адрес и порт сервера.
-
Имеет небольшой объем памяти.
-
Требует установленного PHP-расширения
memcached -
При перезагрузке сервера кеш очищается.
-
При нехватке памяти кеш сбрасывается.
-
Кеш в оперативной памяти работает быстро.
Группы
На вкладке выбираются группы пользователей, для которых будет срабатывать композитный режим. Все группы пользователя должны входить в разрешенный список. Группа «Все пользователи» с идентификатором 2 учитывается системой автоматически.
Пример. Пользователь входит в группы «Зарегистрированные пользователи», «Пользователи, имеющие право голосовать за рейтинг» и «Пользователи, имеющие право голосовать за авторитет». Если на вкладке выбрана только группа «Зарегистрированные пользователи», композитный режим для этого пользователя не работает: две другие группы отсутствуют в разрешенном списке.

Чтобы разрешить композитный режим для такого набора групп, выберите все три группы на вкладке. Исключать пользователя из групп следует только тогда, когда соответствующие права ему больше не нужны.

Кеширование административной панели — признак неправильной настройки групп. Группы, которым доступна административная панель, не должны быть в списке для композитного режима.
Кнопка «Быстро с 1С-Битрикс»
Кнопка «Быстро с 1С-Битрикс» отображается в правом нижнем углу страниц при включении технологии Композитный сайт. Внешний вид кнопки можно настроить на вкладке Кнопка «Быстро с 1С-Битрикс».
Кнопка работает как индикатор быстроты загрузки страницы. Она отобразится, если время загрузки страницы соответствует критериям композита. Отсутствие кнопки — признак проблем с производительностью, например, ошибок в коде или в архитектуре проекта.
Чтобы переместить кнопку, добавьте в шаблон сайта область с id="bx-composite-banner".
Префикс файлов cookies
Композитный сайт можно включить для определенных групп пользователей. Различить пользователей помогают префиксы cookies:
-
BITRIX_SM_NCC— для пользователей без композитного кеша, -
BITRIX_SM_CC— для пользователей с композитным кешем.
Префикс BITRIX_SM установлен по умолчанию в настройках Главного модуля в поле Имя префикса для названия cookies (без точек и пробелов). Если изменить это значение, композитный кеш перестанет корректно работать для администраторов.
Не рекомендуется изменять префикс BITRIX_SM. Если это необходимо, внесите изменения в настройки NGINX.
-
В конфигурационном файле сервера замените конструкции
$cookie_BITRIX_SM_***на
$cookie_Новый_префикс_***. -
Убедитесь, что в файле
/bitrix/html_pages/.config.phpуказаны правильные префиксы в ключах:-
COOKIE_LOGIN -
COOKIE_PASS -
COOKIE_NCC -
COOKIE_CC -
COOKIE_PK
-
Как проверить работу композитного сайта
-
Список закешированных страниц и статистика. Список всех сохраненных кешей страниц находятся в разделе Настройки > Настройки продукта > Композитный сайт > Страницы.
-
Просмотры — показывает популярность страниц.
-
Перезапись — большое число перезаписей указывает на проблемы: частое обновление контента или ошибки в настройках.
-
-
Кнопка «Быстро с 1С-Битрикс». Когда кнопка отображается на странице — композитный кеш работает. Если в шаблоне сайта нет кнопки, вы можете временно добавить ее.
-
Плагин для разработчика. Упростить проверку помогает плагин для Chrome. Он показывает:
-
работает ли сайт на Композите,
-
обновляется ли кеш при фоновом AJAX-запросе,
-
есть ли ошибки на страницах.
Если значок плагина — зеленый, композитный кеш работает корректно.
-
Как выполнить отладку композитного сайта
Основной инструмент отладки — страница Настройки > Настройки продукта > Композитный сайт > Отладка. Здесь ведется логирование всех ошибок работы композитного кеша.
По умолчанию инструмент отладки отключен. Чтобы включить его:
-
укажите время работы отладки,
-
включите отладку.
Чтобы проверить страницы сайта самостоятельно, зайдите на них под пользователем, для которого работает композитный кеш. В списке отобразятся страницы, которые не смогли создать кеш.
Информация для отладки
Тип события
Причина, по которой страница попала в список. Возможные ошибки и их решения:
-
Перезапись кеша — частая ошибка, вызванная обновлением контента или системы.
Решение: проверить частоту обновлений контента.
-
Голосование компонента «Против» — компонент не поддерживает композитный режим.
Решение: адаптировать компонент (неактуально для Автокомпозита).
-
Вызов RestartBuffer — метод
RestartBufferиспользуется на страницах, которые не должны кешироваться.Решение: убрать вызов
RestartBuffer, если страница должна кешироваться. -
Сброс кеша — кеш сброшен из-за обновления контента или системы.
Решение: действия не требуются, если сброс происходит редко
-
Не GET-запрос — композитный режим работает только с GET-запросами.
Решение: убедиться, что запросы выполняются методом GET.
-
Параметр
ncc— параметр URLnccзапрещает кеширование.Решение: удалить параметр
ncc, если он добавлен вручную. -
Cookie
_NCC— служебная cookie_NCC(No Composite Cache) запрещает кеширование.Решение: настроить группы пользователей.
-
Маска исключения — страница добавлена в поле «Маска исключения» в настройках композита.
Решение: удалить страницу из списка исключений.
-
Параметр исключения — в URL страницы присутствует параметр из списка исключений.
Решение: удалить параметр из списка исключений.
-
Неверный домен — домен не указан в поле «Список доменных имен».
Решение: добавить домен в список.
-
Неверный параметр запроса — параметр отсутствует в списке разрешенных параметров.
Решение: добавить параметр в список разрешенных.
-
Локальный редирект — внутренний редирект (например, короткие ссылки).
Решение: убедиться, что редиректы не мешают кешированию.
-
Административная панель — кеш не применяется к страницам с административной панелью.
Решение: это правильное поведение, действия не требуются
-
Аварийное завершение PHP (
die) — кеш не создан из-за вызоваdieилиexit.Решение: убрать вызовы
dieилиexit. -
Страница против кеширования — установлен запрет на кеширование страницы.
Решение: удалить запрет на кеширование.
-
Композитный Javascript не внедрен — проблемы с внедрением JS.
Решение: проверить код и устранить ошибки.
-
Cookie
_CCне найдена — отсутствует cookie композитного кеша_CC.Решение: настроить группы пользователей.
-
Параметр
sessid— в запросе есть сохраненная авторизация.Решение: убедиться, что параметр
sessidне мешает кешированию. -
Ajax-запрос — запрос выполнен через
BX.ajax.Решение: Ajax-запросы не кешируются.
-
Директория
/bitrix/— административный раздел по умолчанию исключен из кеширования.Решение: это правильное поведение, действия не требуются.
-
Файл
index-controller.php— адрес запрещен для кеширования.Решение: это правильное поведение, действия не требуются.
Пользователь
Логин пользователя, обращение которого не создало кеш. Поможет определить, как композитный сайт работает для групп пользователей.
Сообщение
Содержит дополнительную информацию для расширенной отладки. Может показывать название компонента, путь к шаблону компонента или ссылку Сравнить версии для страниц с перезаписью.
Ссылка Сравнить версии открывает инструмент, который сравнивает код старой и новой версии страниц.

Инструмент выделяет:
-
зеленым — добавленный код,
-
красным — удаленный код.
По ссылке исходный код можно скачать полный код страницы для детального анализа.
Рекомендации для отладки
-
В период отладки система создает много файлов с расширением
.delete.<microtime>. Они быстро расходуют место на диске. Увеличьте место для хранения кеша на время отладки, либо периодически очищайте кеш. -
Параметр
ncc=1в URL отменяет использование композитного кеша. Этот параметр можно использовать при отладке. Если нужны собственные исключающие параметры, используйте~EXCLUDE_PARAMSв файле.config.php. -
После завершения отладки отключите константу
BX_COMPOSITE_DEBUG, чтобы избежать излишнего использования места на диске. -
После внесения изменений на сайте проверяйте лог на наличие ошибок.
Как адаптировать переменные
При переходе на Композитный сайт замените с PHP на JavaScript переменные:
-
bitrix_sessid_get -
USER_ID -
SERVER_TIME -
SERVER_TZ_OFFSET,USER_TZ_OFFSET,USER_TZ_AUTO
Замените их на BX.message. Например, для bitrix_sessid_get используйте BX.message('bitrix_sessid') или BX.bitrix_sessid().
Данные будут получены с сервера или из локального хранилища, если это не первый визит.
-
Система ищет данные в сообщениях
BX.message. -
Если данных нет — проверяет локальное хранилище.
-
Если данных нет нигде, выполняется синхронный запрос. Он блокирует выполнение страницы до получения данных.
Серверные переменные
Не используйте серверные переменные в шаблонах компонентов, например, переменную $_SERVER['HTTP_USER_AGENT']. Это может вызвать проблемы, например, перезапись HTML-файлов из-за разных контрольных сумм для браузеров. Обрабатывайте такие данные в PHP-коде компонента, а не в шаблоне.
Функция bitrix_sessid_post
Функция bitrix_sessid_post генерирует в HTML скрытое поле hidden с хешом от ID сессии пользователя для защиты форм от CSRF-атак. С композитом это невозможно, так как HTML-код кешируется и должен быть одинаковым для всех пользователей.
В режиме Композитного сайта функция возвращает пустое значение value. Реальное значение устанавливается через JavaScript. Это нужно для корректной работы кеширования, так как значение bitrix_sessid может быть разным для разных пользователей.
При использовании форм на страницах с Композитным сайтом, убедитесь, что bitrix_sessid_post корректно обрабатывается. Иначе формы могут потерять защиту от CSRF.
Как работать с динамическими зонами
В компонентах
-
Используйте метод
setAnimationдля плавного появления контента. -
Убедитесь, что динамичные части не вложены друг в друга.
Пример кода:
$frame = $this->createFrame("top_banner")->begin();
$frame->setAnimation(true); // Включает плавное появление контента
// Здесь размещается динамический контент
$frame->end();
В шаблоне сайта
Если нужно создать динамическую зону вне компонента, например в header.php, используйте методы startDynamicWithID и finishDynamicWithID:
\Bitrix\Main\Page\Frame::getInstance()->startDynamicWithID("area"); // Начало динамической зоны
// Здесь размещается динамический контент вне компонента
\Bitrix\Main\Page\Frame::getInstance()->finishDynamicWithID("area", ""); // Завершение динамической зоны
Буферизация позволяет управлять заглушками и разделять логику основного контента и заглушки.
$frame = new \Bitrix\Main\Page\FrameBuffered("my_dynamic_area"); // Создание буферизированной зоны
$frame->begin(); // Начало динамической зоны
// Здесь размещается динамический контент
$frame->beginStub(); // Начало заглушки
// Здесь размещается контент заглушки
$frame->end(); // Завершение динамической зоны
Как избежать мерцания в динамической зоне
Эффект мерцания возникает, когда пользователь видит заглушку перед загрузкой актуальных данных. Например, счетчик товаров в корзине сначала показывает 0, а затем обновляется.
-
В кеш записывается заглушка. Например,
0 товаров. -
Пользователь видит страницу с заглушкой.
-
Даже если AJAX-запрос выполняется быстро, пользователь продолжает видеть заглушку.
Возможные решения:
-
Настроить заглушку. Показывайте нейтральный текст «Загрузка…» вместо значения
0 товаров, которое пользователь может принять за актуальные данные. Сам по себе методinsertAdjacentHTMLне устраняет смену заглушки динамическим контентом. -
Использовать
localStorage. Сохраненное значение можно показать до получения ответа сервера, а затем заменить актуальным. Учитывайте, что данные в хранилище могут устареть. ИспользуйтеBX.localStorageдля работы с локальным хранилищем.BX.localStorage.set("cart_count", 5); // Сохранение данных var count = BX.localStorage.get("cart_count"); // Получение данных /* События localStorage: onLocalStorageSet — при сохранении данных. onLocalStorageRemove — при удалении данных. onLocalStorageChange — при изменении данных. */
Как работать с JS в Композитном сайте
Технология Композитный сайт не ограничивает использование языка JS. Однако при повторном запросе часть DOM изменяется. Это может привести к потере событий, привязанных к динамическим зонам из внешних файлов. После вставки динамической зоны нужно заново инициализировать все обработчики.
Отключить автоматическое обновление
Если нужно самостоятельно управлять обработкой динамических зон, автоматическое обновление можно отключить с помощью метода setAutoUpdate.
$frame->setAutoUpdate(false);
Отключение работает для любой динамической области на странице.
Указать время жизни кеша можно методом setAutoUpdateTTL.
События для работы с динамическими зонами
Для подписки на события передайте в BX.addCustomEvent имя события и функцию-обработчик. Композитный JavaScript передаст данные в аргументы этой функции:
-
onFrameDataReceivedBefore— происходит перед началом цикла вставки динамических блоков.BX.addCustomEvent("onFrameDataReceivedBefore", function(json) { console.log("Получены динамические данные", json); }); // json — все данные, полученные в композитном AJAX-запросе -
onBeforeDynamicBlockUpdate— происходит перед вставкой каждого блока.BX.addCustomEvent("onBeforeDynamicBlockUpdate", function(block, fromCache) { console.log("Динамический блок", block, "Из кеша браузера", fromCache); }); /* block — данные конкретного блока: id, контент и другие параметры. fromCache — равен true, если данные вставляются из кеша браузера. */Вставка не происходит, если для зоны указано
$frame->setAutoUpdate(false). -
onFrameDataReceived— происходит после передачи полученных данных на обработку. Загрузка ресурсов и вставка блоков могут завершиться позже.BX.addCustomEvent("onFrameDataReceived", function(json) { console.log("Данные переданы на обработку", json); }); // json — все данные, полученные в композитном AJAX-запросе -
onFrameDataProcessed— происходит после вставки динамических блоков. Используйте его для инициализации обработчиков, которым нужен обновленный DOM.BX.addCustomEvent("onFrameDataProcessed", function(blocks, fromCache) { console.log("Динамические блоки вставлены", blocks, fromCache); });
Узнать режим работы страницы
Глобальная переменная window.frameCacheVars содержит настройки композитного режима. Ее наличие не означает, что динамические блоки уже вставлены в DOM.
Пример. Функция Working() содержит ваш код инициализации. На странице с композитным кешем вызывайте ее после вставки динамических блоков, а при обычной загрузке — после готовности DOM. Разместите код после объявления window.frameCacheVars, но до обработки ответа с динамическими блоками. Пример рассчитан на включенное автоматическое обновление:
if (typeof window.frameCacheVars !== "undefined") {
BX.addCustomEvent("onFrameDataProcessed", function(blocks, fromCache) {
Working(); // Выполняем функцию Working после загрузки динамических данных
});
} else {
BX.ready(function() {
Working(); // Выполняем функцию Working после полной загрузки страницы
});
}
Кроме window.frameCacheVars, можно использовать переменную window.frameRequestStart. Она помогает определить момент начала запроса данных для динамических блоков.
Заголовки и 304 ответ
При отдаче страницы из кеша или в ответе на AJAX-запрос добавляется заголовок X-Bitrix-Composite со значениями:
-
Cache (200)— страница отдана из композитного кеша. -
Cache (304)— кеш не изменился, браузер использует сохраненную копию страницы. -
Ajax— ответ на композитный AJAX-запрос. -
Ajax (stable)— кеш не изменился. -
Ajax (changed)— кеш изменился на этом хите. -
Ajax (error:not_cacheable)— страница не может быть закеширована. -
Ajax (error:redirect)— выполнен редирект. -
Ajax (error:not_injected)— композитный JS не записался в кеш.
Ответ 304 Not Modified зависит от условий запроса, а не от номера посещения страницы. При выдаче кеша сервер может передать заголовки Last-Modified и ETag. Браузер использует их при последующей проверке сохраненной копии.
В PHP-обработчике композитного кеша ответ 304 формируется, если кеш существует и выполняется хотя бы одно условие:
- заголовок запроса
If-None-Matchсовпадает сETagкеша, - дата в заголовке
If-Modified-Sinceне меньше даты изменения кеша.
В таком ответе сервер не передает тело страницы, а браузер использует сохраненный HTML. Если условия не выполнены, сервер передает содержимое кеша с кодом 200. При выдаче кеша через NGINX обработка условных запросов зависит от его конфигурации.
Как обработать неудачный запрос
Если 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"; // перенаправляем пользователя на страницу с выключенным композитом ncc=1
});
Частая перезапись кеша
Страницы могут перезаписываться слишком часто, даже если динамический контент не изменяется.
В папке кеша /bitrix/html_pages/<domain>/ файлы перед перезаписью копируются с расширением *.delete.<microtime>. Это позволяет сравнить старую и новую версии страницы.
Типовые причины
-
Использование случайных идентификаторов — например,
IDсессии или JS-объектов.Решение: в шаблоне компонента используйте метод
$this->randString(6)для получения строки из повторяемой псевдослучайной последовательности. Число6задает длину строки. -
Разный контент для разных браузеров
Решение: убедиться, что контент не зависит от браузера.
-
Подстановка
REQUEST_URI— например, вform[action]илиback_url.Решение: раздел
site.ru/folder/и индексная страница разделаsite.ru/folder/index.phpдолжны использовать один файл кеша. -
Не все динамичные зоны выделены
Решение: проверить, что весь динамичный контент находится в динамичных зонах.
-
Использование данных из сессии — например,
id,loginпользователя.Решение: убедиться, что такие данные не влияют на кеш.
-
Разный контент для авторизованных и анонимных пользователей.
Решение: контент не должен зависеть от авторизации.
-
Добавление CSS и JS в зависимости от пользователя.
Решение: ресурсы должны добавляться одинаково для всех пользователей.
Переменные данные в head
Если компонент добавляет CSS или JS в <head> по условию, это вызывает частую перезапись кеша. Добавлением ресурсов управляет метод Bitrix\Main\Page\AssetMode::setAssetMode. Метод принимает один из режимов:
-
AssetMode::STANDARD— ресурсы добавляются стандартным образом. -
AssetMode::NO_ASSETS— ресурсы не добавляются в<head>.
$dynamicArea = new \Bitrix\Main\Page\FrameStatic("workarea");
$dynamicArea->setAssetMode(AssetMode::STANDARD); // Устанавливает режим добавления ресурсов
$dynamicArea->setStub("заглушка"); // Устанавливает заглушку
$dynamicArea->startDynamicArea(); // Начало динамической зоны
// Компонент, который добавляет ресурсы в <head>
$APPLICATION->includeComponent("mycompany:mycomponent", "template", array());
$dynamicArea->finishDynamicArea(); // Завершение динамической зоны
-
setAssetMode(AssetMode::STANDARD)— разрешает добавление ресурсов в<head>стандартным образом. -
setStub("заглушка")— задает заглушку для динамической зоны. -
startDynamicArea()иfinishDynamicArea()— выделяют область, где можно безопасно добавлять ресурсы без лишней перезаписи кеша.
Блок PHP в head
PHP-код в блоке <head>, который проверяет cookie и добавляет стили, вызывает перезапись кеша. Логику лучше вынести в JavaScript.
<head>
<script>
if (document.cookie.indexOf("my_cookie=yes") >= 0) {
// Устанавливаем класс для тега <html>
document.documentElement.className += " has-cookie";
}
</script>
<style>
.block {
display: none;
}
.has-cookie .block {
display: block;
}
</style>
</head>
Случайные строки
Случайная строка в статической части страницы может менять ее содержимое при каждом запросе и вызывать перезапись кеша.
Метод $this->randString() в шаблоне компонента возвращает следующую строку из псевдослучайной последовательности. Начальное состояние зависит от имени компонента и порядкового номера его вызова на странице. Значения повторяются между запросами при одинаковом порядке подключения компонентов и вызовов randString() с одинаковой длиной. Это не одна постоянная строка для страницы, и глобальная уникальность результата не гарантируется.
Получите строку длиной шесть символов в шаблоне компонента:
$id = $this->randString();
Как сбросить кеш
При изменении шаблона сайта рекомендуется сбрасывать композитный кеш. Сделать это можно через настройки в продукте, cron или API.
Не рекомендуем удалять папку с кешем /bitrix/html_pages/<domain>/ вручную. Это может привести к ошибкам, если до сброса кеша была превышена квота. Если вы удалили папку — очистите файл /bitrix/html_pages/.enabled, чтобы сбросить статистику.
-
Через настройки в продукте. Используйте ссылку Сбросить кеш на странице настроек Композитного сайта.

-
Через cron. Чтобы сбросить кеш через cron используйте файл
cron_html_pages.php. Он находится по пути/path_to_site/bitrix/modules/main/tools/cron_html_pages.php.Пример команды для удаления кеша старше 10 часов:
php -f /path_to_site/bitrix/modules/main/tools/cron_html_pages.php 10 -
Через API. Для сброса кеша с помощью API можно использовать метод
\Bitrix\Main\Data\StaticHtmlCache.$staticHtmlCache = \Bitrix\Main\Data\StaticHtmlCache::getInstance(); $staticHtmlCache->deleteAll();
Особенности работы с кешем
Кеш в хранилище браузера
Для хранения данных в локальном хранилище браузера используйте метод setBrowserStorage(true).
$frame = $this->createFrame()->begin(); // Создание динамической зоны
$frame->setBrowserStorage(true); // Включает использование локального хранилища браузера
// Здесь размещается динамический контент
$frame->end(); // Завершение динамической зоны
Полное кеширование шаблона компонента
Если нужно кешировать весь контент шаблона и обновлять его на втором хите, поместите код шаблона в createFrame()->begin().
$frame = $this->createFrame()->begin(); // Начало динамической зоны для всего шаблона
// Весь контент шаблона
$frame->end(); // Завершение динамической зоны
Отмена композита в любой части страницы
Метод markNonCacheable отменяет композитный режим для страницы.
\Bitrix\Main\Data\StaticHtmlCache::getInstance()->markNonCacheable();
Композит в системах аналитики
Google Analytics и Яндекс Метрика собирают данные на основе Navigation Timing. Композитный сайт влияет только на время ожидания ответа от сервера Server Response Time и не влияет:
-
на DNS lookup,
-
TCP-соединение,
-
загрузку JS, CSS и изображений.
Используйте глобальную переменную window.frameRequestStart, чтобы определить, запускался ли фоновый композитный запрос.
Пример. Сформируйте признак запуска запроса для передачи в используемую систему аналитики. Здесь значение выводится в консоль:
var compositeMetrics = {
compositeRequestStarted: window.frameRequestStart === true
};
console.log(compositeMetrics);
Код проверки window.frameRequestStart должен располагаться ниже кода, запускающего фоновый композитный запрос.