Перейти к содержимому

Второй сайт на одном ядре - домен, папка, шаблон, общие данные

Поднимаем второй сайт на той же копии платформы: запись сайта, домен и папка, свой шаблон и привязка данных к каждому сайту.

Что нужно знать заранее

Многосайтовость решают двумя схемами, и выбор делают до первой настройки. Сайты либо живут в подпапках одного корня, либо получают отдельные корни с общим каталогом ядра и загрузок.

Число сайтов на одной копии ограничено редакцией продукта. Проверять это надо до работ: младшие редакции второй сайт просто не дадут создать, и схема окажется бесполезной.

Сайт в платформе - это запись с идентификатором, папкой, доменом и шаблоном. Почти все данные потом привязываются именно к ней: инфоблоки, письма, службы доставки, свойства заказа и права.

Шаги

  1. Проверить по редакции продукта, сколько сайтов разрешено на этой копии.
  2. Выбрать схему: подпапка общего корня или отдельный корень с общим ядром.
  3. Завести запись сайта с идентификатором, папкой, доменом и шаблоном.
  4. Настроить виртуальный хост веб-сервера на корень нового сайта.
  5. Привязать инфоблоки, почтовые шаблоны и торговые настройки к нужным сайтам.

Решение

Раскладываем файлы для схемы с общим ядром:

/home/site/www/ - корень первого сайта, здесь настоящий /bitrix
/home/site2/www/bitrix - символическая ссылка на /home/site/www/bitrix
/home/site2/www/upload - символическая ссылка на общий каталог загрузок
# шаблоны, компоненты и страницы у каждого сайта свои

Ядро и загрузки общие, а публичные файлы у сайтов свои. Так обновление ставится один раз, а страницы, шаблоны и включаемые области второго сайта не мешаются с первым.

Настраиваем виртуальный хост второго домена:

server {
server_name second.example.com;
root /home/site2/www; # свой корень со ссылками на ядро
include bx/conf/bitrix.conf; # общие правила окружения
}
# в веб-окружении такой хост создаёт его собственная утилита управления сайтами

Смотрим и правим записи сайтов:

$sites = \Bitrix\Main\SiteTable::getList([
'select' => ['LID', 'NAME', 'SERVER_NAME', 'DIR', 'ACTIVE', 'DEF'], // DEF - основной сайт
])->fetchAll();
print_r($sites);
// LID - код сайта: он попадает в фильтры данных и в почтовые шаблоны
// DIR - папка сайта относительно корня, SERVER_NAME - его домен

Идентификатор сайта - две буквы, и он попадает почти во все таблицы платформы. Менять его после наполнения контентом нельзя, поэтому продумывают сразу, а не переименовывают потом.

Привязываем инфоблок к обоим сайтам:

$iblock = new \CIBlock();
$iblock->Update($iblockId, ['SITE_ID' => ['s1', 's2']]); // общий каталог двух сайтов
// без привязки к сайту элементы не выводятся и адреса не строятся

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

Проверяем текущий сайт и его папку из кода:

$context = \Bitrix\Main\Context::getCurrent();
printf("сайт=%s папка=%s\n", $context->getSite(), SITE_DIR);
// в консольном скрипте и в агенте текущего сайта нет: его задают явно

Фоновые задания выполняются вне сайта, и правильный сайт им передают параметром. Иначе письма уходят с адресами первого сайта, а покупатель второго получает ссылку на чужой домен.

Типичные проблемы

Каталог второго сайта пустой, хотя элементы есть.

Инфоблок не привязан ко второму сайту в своих настройках. Привязку к сайтам задают у инфоблока, и без неё выборка на витрине пуста.

Письма второго сайта уходят с чужими ссылками.

Почтовый шаблон привязан только к первому сайту или собран с жёстким доменом. Шаблоны заводят на каждый сайт и берут домен из настроек.

Второй домен открывает первый сайт.

Домен не записан в настройках сайта или виртуальный хост смотрит в общий корень. Проверяют обе настройки: запись сайта и конфигурацию веб-сервера.

Шаблон второго сайта не применяется.

В настройках сайта оставлен шаблон по умолчанию или правило показа задано условием. Шаблон выбирают в записи сайта, а условия проверяют отдельно.

Обновления приходится ставить дважды.

Сайты подняты на двух независимых копиях ядра вместо общей. При схеме с общим ядром обновление ставится один раз на обе витрины.

Частые вопросы

Сколько сайтов можно завести на одной копии?

Зависит от редакции продукта, и младшие редакции второй сайт не позволяют. Число проверяют до начала работ, а не после настройки домена.

Можно ли держать сайты на разных доменах?

Да, домен указывается в записи сайта и в виртуальном хосте веб-сервера. Схема с общим ядром для того и нужна: разные домены, одна копия платформы.

Общие ли пользователи у сайтов?

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

Как разделить товары между сайтами?

Привязкой инфоблоков к сайтам и разными типами цен для разных аудиторий. Общий каталог привязывают к обоим сайтам, отдельный - только к своему.

Что делать с кэшем при двух сайтах?

Штатные компоненты учитывают сайт в ключе кэша сами. В своём коде сайт добавляют в ключ, иначе витрины начинают показывать чужие данные.

Смежное

Первоисточник