Второй сайт на одном ядре - домен, папка, шаблон, общие данные
Поднимаем второй сайт на той же копии платформы: запись сайта, домен и папка, свой шаблон и привязка данных к каждому сайту.
Что нужно знать заранее
Многосайтовость решают двумя схемами, и выбор делают до первой настройки. Сайты либо живут в подпапках одного корня, либо получают отдельные корни с общим каталогом ядра и загрузок.
Число сайтов на одной копии ограничено редакцией продукта. Проверять это надо до работ: младшие редакции второй сайт просто не дадут создать, и схема окажется бесполезной.
Сайт в платформе - это запись с идентификатором, папкой, доменом и шаблоном. Почти все данные потом привязываются именно к ней: инфоблоки, письма, службы доставки, свойства заказа и права.
Шаги
- Проверить по редакции продукта, сколько сайтов разрешено на этой копии.
- Выбрать схему: подпапка общего корня или отдельный корень с общим ядром.
- Завести запись сайта с идентификатором, папкой, доменом и шаблоном.
- Настроить виртуальный хост веб-сервера на корень нового сайта.
- Привязать инфоблоки, почтовые шаблоны и торговые настройки к нужным сайтам.
Решение
Раскладываем файлы для схемы с общим ядром:
/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);// в консольном скрипте и в агенте текущего сайта нет: его задают явноФоновые задания выполняются вне сайта, и правильный сайт им передают параметром. Иначе письма уходят с адресами первого сайта, а покупатель второго получает ссылку на чужой домен.
Типичные проблемы
Каталог второго сайта пустой, хотя элементы есть.
Инфоблок не привязан ко второму сайту в своих настройках. Привязку к сайтам задают у инфоблока, и без неё выборка на витрине пуста.
Письма второго сайта уходят с чужими ссылками.
Почтовый шаблон привязан только к первому сайту или собран с жёстким доменом. Шаблоны заводят на каждый сайт и берут домен из настроек.
Второй домен открывает первый сайт.
Домен не записан в настройках сайта или виртуальный хост смотрит в общий корень. Проверяют обе настройки: запись сайта и конфигурацию веб-сервера.
Шаблон второго сайта не применяется.
В настройках сайта оставлен шаблон по умолчанию или правило показа задано условием. Шаблон выбирают в записи сайта, а условия проверяют отдельно.
Обновления приходится ставить дважды.
Сайты подняты на двух независимых копиях ядра вместо общей. При схеме с общим ядром обновление ставится один раз на обе витрины.
Частые вопросы
Сколько сайтов можно завести на одной копии?
Зависит от редакции продукта, и младшие редакции второй сайт не позволяют. Число проверяют до начала работ, а не после настройки домена.
Можно ли держать сайты на разных доменах?
Да, домен указывается в записи сайта и в виртуальном хосте веб-сервера. Схема с общим ядром для того и нужна: разные домены, одна копия платформы.
Общие ли пользователи у сайтов?
Да, пользователи в платформе общие для всей копии. Разделяют их группами и правами, а не отдельными списками для каждого сайта.
Как разделить товары между сайтами?
Привязкой инфоблоков к сайтам и разными типами цен для разных аудиторий. Общий каталог привязывают к обоим сайтам, отдельный - только к своему.
Что делать с кэшем при двух сайтах?
Штатные компоненты учитывают сайт в ключе кэша сами. В своём коде сайт добавляют в ключ, иначе витрины начинают показывать чужие данные.
Смежное
-
Настройки и окружение - оглавление подтемы
-
Данные на двух сайтах: каталог, цены, заказы, письма - что общее и что своё у витрин
-
Код для двух сайтов: текущий сайт, настройки, общие данные - как писать код под две витрины
-
Шаблон под раздел и по условию: правила показа, приоритет, печать - если хватит второго шаблона, а не сайта
-
Настройки проекта: файл ядра, опции модуля, разные стенды - где лежат настройки копии
-
Настройка не применяется: разбор причин - если настройка сайта не сработала
-
Несколько сайтов и конфигураций в обмене: разделение данных - обмен с учётной системой при двух сайтах
-
Многоязычный каталог: языки, свойства, вывод - соседняя задача про две витрины
-
Смена домена сайта: настройки, ссылки, письма - что завязано на домен сайта
-
Поддомены и второй сайт: одна установка или две - сторона сервера и пула окружения
-
Ядро D7 - устройство ядра целиком
-
Редакция продукта: ограничения, переход на старшую, ключ - предел числа сайтов в редакции
-
Второй язык сайта: языки и сайты, тексты шаблона, переключатель - когда вторая витрина нужна ради языка