Это классическая проблема конфликта 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 в браузере перед тестированием.