Это классическая проблема конфликта 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:
-
После внесения изменений обязательно сбросьте весь кэш в Битрикс.
-
Критически важно: Очистите все 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 в браузере перед тестированием.
Ищете надежного партнера по веб-разработке и автоматизации? Мы помогаем бизнесу расти с помощью современных технологий, автоматизации процессов и экспертного SEO. Свяжитесь с нами, чтобы обсудить вашу задачу.