Yandex Metrika
sanches.free

Cookie в Bitrix D7: класс Cookie, префикс и ответ

Контекст

В D7 установка заголовков Set-Cookie делается через объект ответа: вы создаёте экземпляр \Bitrix\Main\Web\Cookie, настраиваете область действия и передаёте его в getResponse()->addCookie(). Чтение — через текущий HttpRequest. Так вы остаетесь в одной модели с остальным ядром, а не смешиваете прямой setcookie() с внутренними правилами префиксов.

Установка значения

Пример: имя и значение, срок жизни 30 дней, распространение на домен, путь /, при необходимости флаги Secure и HttpOnly под вашу схему HTTPS и политику XSS:

$cookie = new \Bitrix\Main\Web\Cookie('CookieName', 'CookieValue', time() + 86400 * 30);
$cookie->setSpread(\Bitrix\Main\Web\Cookie::SPREAD_DOMAIN);
$cookie->setDomain('mydomain.ru');
// либо, например, \Bitrix\Main\Application::getInstance()->getContext()->getRequest()->getHttpHost()
$cookie->setPath('/');
$cookie->setSecure(false);
$cookie->setHttpOnly(false);

\Bitrix\Main\Application::getInstance()->getContext()->getResponse()->addCookie($cookie);

Пока ответ реально не ушёл клиенту, браузер cookie не получит: для обычной страницы заголовки уйдут с эпилогом; в нестандартных точках входа смотрите следующий блок.

AJAX и вывод без полного эпилога

Если сохранение выполняется из обработчика AJAX без типового завершения запроса, заголовки нужно отправить явно:

\Bitrix\Main\Context::getCurrent()->getResponse()->writeHeaders();

Иначе addCookie() отработает в объекте ответа, но клиент не увидит Set-Cookie.

Чтение значения

Через контекст приложения получают HttpRequest и читают cookie по имени. Два варианта — с учётом префикса из настроек главного модуля и «сырое» имя:

$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();

$value = $request->getCookie('name');
// Префикс BITRIX_SM_ или другой из настроек главного модуля подставляется автоматически

$valueRaw = $request->getCookieRaw('name');
// Имя в том виде, как пришло в запросе, без автоматического префикса

На что смотреть в продакшене

  • Для публичного HTTPS включайте setSecure(true), если cookie не должны улетать по HTTP.
  • setHttpOnly(true) уместен для служебных меток, которые не должны быть доступны из JS.
  • Домен и SPREAD_* должны совпадать с реальной схемой поддоменов, иначе браузер просто проигнорирует заголовок.

Итог

Минимальный цикл в D7: создать Cookie, настроить область (setDomain, setPath, setSpread), добавить через getResponse()->addCookie(), при обрывном сценарии вызвать writeHeaders(), читать через getRequest()->getCookie / getCookieRaw в зависимости от того, нужен ли префикс платформы.

Не хотите копаться сами?

Починю за 1-3 дня. Без предоплаты — оплата по результату.

15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии