Общие

Конфликт cookies при многосайтовости на поддоменах, когда сессия одного сайта мешает другому.

Конфликт cookies при многосайтовости на поддоменах, когда сессия одного сайта мешает другому.

Это классическая проблема конфликта cookies при многосайтовости на поддоменах, когда сессия одного сайта мешает другому. Битрикс имеет встроенные механизмы для решения этой задачи.

 Вот основные шаги для решения:


-

	 Использовать уникальные префиксы для COOKIE: Каждый сайт (основной домен и каждый поддомен) должен использовать свой уникальный префикс для имен cookie. Это предотвратит перезапись cookie одного сайта другим.





-

	 Ограничить область действия COOKIE (cookie domain): Для каждого сайта нужно указать, что его cookie должны действовать только на его собственном домене, а не на родительском домене и всех его поддоменах.






 Как это реализовать в Битрикс:


 Вам нужно будет внести изменения в конфигурационные файлы каждого сайта. Обычно это `dbconn.php` или `.settings.php`.


 Вариант 1: Через `dbconn.php` (традиционный способ)


 Для каждого сайта (основного и каждого поддомена, который работает как отдельный сайт) вам нужен свой файл `/bitrix/php_interface/dbconn.php` или модифицировать общий, если он используется, добавив логику определения сайта.


-

	 Для основного сайта `eu-digital.ru`: В файле `/bitrix/php_interface/dbconn.php` (или в специфичном для этого сайта, если у вас многосайтовость с разными `DOCUMENT_ROOT` для каждого сайта):
define("BX_COOKIE_PREFIX", "main_eudigital_"); // Уникальный префикс для основного сайта
define("BX_SPREAD_COOKIE_DOMAIN", 0); // 0 - Cookies для текущего домена
// @session_set_cookie_params(0, '/', "eu-digital.ru"); // Можно еще так, если BX_SPREAD_COOKIE_DOMAIN не сработает как ожидается
-

	 Для каждого поддомена, например `sub1.eu-digital.ru`: В его файле `/bitrix/php_interface/dbconn.php` (или в соответствующей секции общего файла):
define("BX_COOKIE_PREFIX", "sub1_eudigital_"); // Уникальный префикс для поддомена
define("BX_SPREAD_COOKIE_DOMAIN", 0); // 0 - Cookies для текущего домена
// @session_set_cookie_params(0, '/', "sub1.eu-digital.ru");
	 И так для каждого поддомена, меняя префикс (`sub2_eudigital_`, `shop_eudigital_` и т.д.).




	 Если у вас все сайты работают на одном ядре и используют один `dbconn.php`, то можно сделать так:
<?php
// ... другие определения ...

$current_host = $_SERVER['HTTP_HOST'];
$cookie_prefix = str_replace('.', '_', $current_host) . '_'; // Например, eu_digital_ru_ или sub1_eu_digital_ru_

define("BX_COOKIE_PREFIX", $cookie_prefix);
define("BX_SPREAD_COOKIE_DOMAIN", 0); // Устанавливает куки только для текущего хоста

// Если BX_SPREAD_COOKIE_DOMAIN не отрабатывает как надо, можно попробовать так:
// ini_set("session.cookie_domain", $current_host);
// Либо более явно через session_set_cookie_params, но это нужно делать до session_start()
// session_set_cookie_params(0, '/', $current_host, false, true); // last true for httponly

// ... остальной код dbconn.php ...
?>
	 Важно: `session_set_cookie_params` нужно вызывать до `session_start()`. Битрикс обычно сам управляет этим, и `BX_SPREAD_COOKIE_DOMAIN = 0` должно быть достаточно.










 Вариант 2: Через `.settings.php` (современный способ для новых версий Битрикс)


 Для каждого сайта (основного и каждого поддомена) вам нужен свой файл `/bitrix/.settings.php` (если у вас многосайтовость с разными `DOCUMENT_ROOT`) или соответствующая конфигурация в общем файле (если многосайтовость на одном ядре и одном `DOCUMENT_ROOT`).


 В файле `/bitrix/.settings.php` в секции `['cookie']`:


-

	 Для основного сайта `eu-digital.ru`:
'cookie' => array(
    'value' => array(
        'secure' => false, // true, если только HTTPS
        'httpOnly' => true,
        'prefix' => 'main_eudigital_', // Уникальный префикс
        'domain' => 'eu-digital.ru'    // Явно указываем домен
    ),
    'readonly' => false,
),
-

	 Для поддомена `sub1.eu-digital.ru`:
'cookie' => array(
    'value' => array(
        'secure' => false, // true, если только HTTPS
        'httpOnly' => true,
        'prefix' => 'sub1_eudigital_', // Уникальный префикс
        'domain' => 'sub1.eu-digital.ru' // Явно указываем домен
    ),
    'readonly' => false,
),
	 И так далее для каждого поддомена.




	 Если используется один `.settings.php` для всех сайтов (что менее вероятно, если они "самостоятельные"):
// В начале файла .settings.php
$current_host = $_SERVER['HTTP_HOST'];
$cookie_prefix_dynamic = str_replace(['.', '-'], '_', $current_host) . '_';

return array(
    // ...
    'cookie' => array(
        'value' => array(
            'secure' => false, // Определите сами, нужно ли true
            'httpOnly' => true,
            'prefix' => $cookie_prefix_dynamic,
            'domain' => $current_host // Это должно ограничить куки текущим хостом
        ),
        'readonly' => false,
    ),
    // ...
);
 Дополнительные шаги и проверки:


-

	 Настройки сайтов в Битрикс: Убедитесь, что в настройках каждого сайта (Администрирование > Настройки > Настройки продукта > Сайты > Список сайтов > [ваш сайт]) в поле "Доменное имя для cookies" указан конкретный домен сайта (например, `eu-digital.ru` для основного, `sub1.eu-digital.ru` для поддомена), а не `.eu-digital.ru` (с точкой в начале, что означает распространение на все поддомены). Если оставить поле пустым, Битрикс будет использовать настройки из `BX_SPREAD_COOKIE_DOMAIN` или `.settings.php`. Если `BX_SPREAD_COOKIE_DOMAIN = 0` или в `.settings.php` указан конкретный домен, то это будет правильно.





-

	 Очистка кэша и cookies:





	<li>После внесения изменений обязательно сбросьте весь кэш в Битрикс.

	- Критически важно: Очистите все cookies для доменов `eu-digital.ru` и `*.eu-digital.ru` в вашем браузере. Лучше всего тестировать в режиме инкогнито или в другом браузере, где вы ранее не заходили на эти сайты.
-
	 Проверка `session.cookie_domain` в PHP: Убедитесь, что на уровне конфигурации PHP (`php.ini` или `.htaccess` / `.user.ini`) нет глобальной установки `session.cookie_domain = ".eu-digital.ru"`, которая могла бы переопределять настройки Битрикса.






 Какой вариант выбрать?


- Если у вас старая версия Битрикс или вы привыкли к `dbconn.php`, используйте его.

- Для новых версий и более гибкой конфигурации предпочтительнее `.settings.php`.

- Если каждый "самостоятельный сайт" имеет свой собственный `DOCUMENT_ROOT` и, следовательно, свой экземпляр папки `/bitrix/php_interface/` или `/bitrix/`, то вам нужно будет править соответствующий `dbconn.php` или `.settings.php` для каждого сайта индивидуально, задавая статические префиксы и домены.

- Если это многосайтовость на одном ядре с одним `DOCUMENT_ROOT`, то динамическое определение префикса и домена на основе `$_SERVER['HTTP_HOST']` в общем `dbconn.php` или `.settings.php` будет наиболее подходящим.


 Начните с варианта с `BX_COOKIE_PREFIX` и `BX_SPREAD_COOKIE_DOMAIN = 0` в `dbconn.php` (или аналога в `.settings.php`). Это наиболее вероятное решение. Не забудьте тщательно очистить cookies в браузере перед тестированием.