Перейти к содержанию

Cookie-файлы

Для работы с файлами cookie предназначен класс Bitrix\Main\Web\Cookie. Он позволяет создавать cookie с такими параметрами, как имя, значение, срок действия и путь.

Чтобы задать cookie, используйте класс Bitrix\Main\HttpResponse.

  1. Импортируйте классы Cookie и Context.
use Bitrix\Main\Web\Cookie;
use Bitrix\Main\Context;
  1. Создайте объект cookie. Укажите имя, значение и срок действия cookie.
$cookie = new Cookie("example_cookie", "cookie_value", time() + 3600); // действует 1 час
  1. Настройте параметры cookie. При необходимости задайте домен, путь, флаги безопасности и доступности.
$cookie->setDomain("example.com");
$cookie->setPath("/");
$cookie->setSecure(false); // true, если нужно передавать только по HTTPS
$cookie->setHttpOnly(true); // доступ только через HTTP
  1. Добавьте cookie в ответ. Используйте объект ответа текущего контекста, чтобы добавить созданный cookie.
$response = Context::getCurrent()->getResponse();
$response->addCookie($cookie);

Когда вы добавляете cookie в ответ, они отправляются клиенту и сохраняются у него. Однако сервер сможет прочитать эти файлы cookie только при следующем запросе клиента, так как текущий запрос их еще не получил.

Чтобы получить cookie, используйте класс Bitrix\Main\HttpRequest.

  1. Получите объект запроса. Используйте текущий контекст для доступа к запросу.
use Bitrix\Main\Context;

$request = Context::getCurrent()->getRequest();
  1. Извлеките значение cookie. Используйте метод getCookie объекта запроса, указав имя cookie.
$cookieValue = $request->getCookie("example_cookie");

// Проверка наличия и вывод значения
if ($cookieValue !== null)
{
    echo "Значение cookie: " . $cookieValue;
}
else
{
    echo "Cookie не найдено.";
}

Домен

$cookie->setDomain('example.com'); // установить cookie для домена 'example.com'
$cookie->getDomain(); // получить домен, который был установлен для cookie

Срок действия

$cookie->setExpires(time() + 3600); // установить время истечения cookie через 1 час
$cookie->getExpires(); // получить время истечения cookie

Доступность через HTTP

$cookie->setHttpOnly(true); // установить доступность cookie только через HTTP-протокол
$cookie->getHttpOnly(); // получить текущее значение флага HttpOnly для объекта cookie. Флаг указывает, доступна ли cookie только через HTTP-протокол

Имя

$cookie->setName('session_id'); // установить имя cookie 'session_id'
$cookie->getName(); // получить имя cookie

Путь

$cookie->setPath('/'); // установить путь на сервере, для которого будет доступна cookie
$cookie->getPath(); // получить путь, который был установлен для cookie

Передача по HTTPS

$cookie->setSecure(true); // установить флаг Secure для cookie. Он указывает, что cookie передается только по HTTPS
$cookie->getSecure(); // получить текущее значение флага Secure для cookie. Метод возвращает true или false, которое указывает, передается ли cookie только по HTTPS

Значение

$cookie->setValue('abc123'); // установить значение abc123 для cookie
$cookie->getValue(); // получить текущее значение, хранящееся в cookie

Атрибут SameSite

$cookie->setSameSite('Lax'); // установить атрибут SameSite для cookie, он определяет политику отправки cookie в кросс-сайтовых запросах
$cookie->getSameSite(); // получить текущее значение атрибута SameSite для cookie

Чтобы добавить cookie через AJAX, используйте следующие примеры:

use Bitrix\Main\Application;
use Bitrix\Main\Web\Cookie;

$application = Application::getInstance();
$context = $application->getContext();

$cookie = new Cookie('filter__city', 'Granada', time() + 60*60*24*60);
$cookie->setDomain($context->getServer()->getHttpHost());
$cookie->setHttpOnly(false);

$context->getResponse()->addCookie($cookie);
$context->getResponse()->flush('');

Файл /local/ajax/set_cookie.php:

<?php

require $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/prolog_before.php";

use Bitrix\Main\Application;
use Bitrix\Main\Web\Cookie;

if ($_SERVER['REQUEST_METHOD'] === 'POST' && $_POST['ACTION'] === 'selectMyCity')
{
    $APPLICATION->RestartBuffer();
    header('Content-Type: application/json');

    $response = ['STATUS' => 'ERROR', 'MESSAGE' => 'Не удалось добавить cookie'];

    if (check_bitrix_sessid())
    {
        $city = $_POST['city'];

        $application = Application::getInstance();
        $context = $application->getContext();

        $cookie = new Cookie('filter__city', $city, time() + 60*60*24*30);
        $cookie->setDomain($context->getServer()->getHttpHost());
        $cookie->setHttpOnly(false);

        $context->getResponse()->addCookie($cookie);

        $response = ['STATUS' => 'SUCCESS', 'MESSAGE' => 'Cookie успешно добавлена'];
    }

    echo json_encode($response);
    Application::getInstance()->end();
}

Файл set_cookie.js:

function setCityCookie(city) {
    const xhr = new XMLHttpRequest();
    xhr.open("POST", "/local/ajax/set_cookie.php", true);
    xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

    xhr.onreadystatechange = () => {
        if (xhr.readyState === 4 && xhr.status === 200) {
            const response = JSON.parse(xhr.responseText);
            if (response.STATUS === 'SUCCESS') {
                console.log("Cookie установлена успешно");
            } else {
                console.error("Ошибка установки cookie: " + response.MESSAGE);
            }
        }
    };

    const params = `ACTION=selectMyCity&city=${encodeURIComponent(city)}&sessid=${BX.bitrix_sessid()}`;
    xhr.send(params);
}

Шифрованные cookie \Bitrix\Main\Web\CryptoCookie позволяют передавать данные пользователю без раскрытия их содержимого и без изменения.

Для шифрования данных ядром необходимо указать crypto_key в файле настроек /bitrix/.settings.php.

Совет

Подробнее о шифрованных cookie читайте в статье Защищенные cookie.