Главная > 1С Битрикс > Битрикс — делаем многосайтовость

Битрикс — делаем многосайтовость

На одной установке Битрикса можно сделать много сайтов (без покупки дополнительных лицензий можно сделать два сайта), а значит закроем первый вопрос: для настройки многосайтовости надо установить Битрикс только один раз.
Есть довольно подробный учебный курс, где описывается два способа настройки многосайтовости.

Какой способ выбрать?

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

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

http://example.com/ru

http://example.com/en


или

http://example.com/

http://example.com/KGD

http://example.com/SPB

Если тематика сайтов разная, видимо, не обойтись без настройки второго способа, когда разные сайты находятся в разных доменах, пример:

http://www.bitrixsoft.ru/

http://www.bitrixsoft.com/


Оба сайта работают на одной копии продукта, но внешне это никак не проявляется. Это выглядит привлекательнее, но требует чуть больше усилий для настройки.
Особо хочу обратить внимание, что далее речь идёт о работе на хостинге, когда все настройки сервера делает администратор. Если вы настраиваете многосайтовость локально, необходимо предварительно настроить виртуальные веб сервера. Можно посмотреть об этом на официальном сайте Apache (и в русской части Интернета море статей на эту тему).

Теперь несколько слов о том, как система определяет текущий сайт.
Откроем настройки сайта (Настройки — Настройки продукта — Сайты — Список сайтов):

Здесь можно указать доменное имя и папку сайта — это основные параметры настройки многосайтовости, остальные определяют приоритеты.
Сначала система проверяет текущий домен: из настроек всех сайтов выбираются домены и сопоставляются с доменом на котором находится пользователь. При этом сравнивается только правая часть до точки (т.е. все поддомены автоматически относятся к этому домену). Например, в настройках указано
example.com
а пользователь открыл
www.example.com
будет считаться условие выполненным. Но если он откроет my-example.com — это уже другой домен, его надо отдельно указывать в списке доменных имён.
Если доменные имена не указаны или на разных сайтах указаны одинаковые домены, то определение происходит по папке сайта. Обратите внимание, что здесь указывается папка относительно корня сайта (т.е. путь в URL), а не путь в файловой системе на сервере.
В дальнейшем идентификатор сайта используется для подключения шаблона, выбора новостей, определения языка и т.д.

Пример:
В настройках одного сайта указана папка /, другого /ru.
При открытии example.com/forum/messages/ попадаем на первый сайт, при открытии example.com/ru/forum/messages/ — на второй.
При этом папка bitrix (содержащая ядро продукта) лежит в корне, никуда не копируется и никакие другие настройки на сервере не делаются. Это всё понятно и просто.
Гораздо больше вопросов и проблем возникает с настройкой многосайтовости по второму способу, когда нам необходимо обслуживать одной установкой Битрикс несколько сайтов в разных доменах. Остановимся на этом подробнее.

Многосайтовость по второму способу (мини HOWTO)

Сначала нужно определиться, что мы хотим получить. Будем считать, что имеем два домена:

example.com
example.net

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

При этом хочу обратить внимание на следующие моменты:

  • все домены должны указывать на один сервер, вариант, когда разные домены настроены на разных хостеров, неприемлем;
  • в нашем случае (когда корневые папки доменов разные) не имеет значения, имеем мы разные домены второго уровня или поддомены одного домена (например, games.example.com и example.com). А если быть вернее, то это вообще не имеет значения. То что нас действительно должно интересовать: общая ли у них корневая папка или нет;
  • вариант, когда настраивается большое число поддоменов, которые формируются динамически (например, vasya.example.com, kolya.example.com и т.д.) вообще не является многсайтовостью в контексте нашего продукта, и соответственно руководства многосайтовости сюда не применимы. Рассмотрим этот вариант ниже. Если говорить грубо, то многосайтовость Битрикса — когда настроено несколько сайтов в списке сайтов в настройках продукта.

Задача: настроить многосайтовость по второму способу на UNIX-хостинге.

Шаг за шагом.

1. Устанавливаем Битрикс на один из доменов (не важно, на какой). Для ясности считаем, что установили продукт на example.com. Пока никакие дополнительные настройки не делаем.

2. Теперь необходимо заставить работать ту же копию на втором домене.
Считаем, что публичная часть у сайтов разная (иначе зачем нужны разные сайты?), поэтому для второго сайта потребуется только ядро продукта (папка bitrix, ну и upload). Теоретически, если их просто скопировать из первого сайта, то будет работать, но нас это не устроит (приходилось сталкиваться с такой «многосайтовостью»).
Получим две копии ядра, которые работают с одной базой данных, после обновления одного из них обновится база данных, и второй сайт перестанет работать (ну и кроме того, копирование ядра противоречит лицензии).
Проблема решается использованием символических ссылок. Если говорить образно, ссылка выполняет задачу ярлыка на рабочем столе, который открывает программу, но сам программой не является.
Руководство по многосайтовости рекомендует выносить ядро в общую папку shared, затем делать символические ссылки в каждом сайте. Здесь для простоты изложения я упрощу этот шаг и сделаю ссылку с одного сайта на другой (с функциональной точки зрения разницы нет).
Набросал небольшой скрипт, который поможет создать символические ссылки при использовании только ftp доступа к серверу:

Код

<html>
<head><title>Создание ссылок на папки bitrix и upload</title></head>
<body>
<?
error_reporting(E_ALL & ~E_NOTICE);
@ini_set(«display_errors»,1);if ($_POST['path'])
$path = rtrim($_POST['path'],»/\\»);
else
$path = ‘../site2/www’;

if ($_POST['create'])
{
if (preg_match(«#^/#»,$path))
$full_path = $path;
else
$full_path = realpath($_SERVER['DOCUMENT_ROOT'].’/’.$path);

if (file_exists($_SERVER['DOCUMENT_ROOT'].»/bitrix»))
$strError = «В текущей папке уже существует папка bitrix»;
elseif (is_dir($full_path))
{
if (is_dir($full_path.»/bitrix»))
{
if (symlink($path.»/bitrix»,$_SERVER['DOCUMENT_ROOT'].»/bitrix»))
{
if(symlink($path.»/upload»,$_SERVER['DOCUMENT_ROOT'].»/upload»))
echo «<font color=green>Символические ссылки удачно созданы</font>»;
else
$strError = ‘Не удалось создать ссылку на папку upload, обратитесь к администратору сервера’;
}
else
$strError = ‘Не удалось создать ссылку на папку bitrix, обратитесь к администратору сервера’;

}
else
$strError = ‘Указанный путь не содержит папку bitrix’;
}
else
$strError = ‘Неверно указан путь или ошибка прав доступа’;

if ($strError)
echo ‘<font color=red>’.$strError.’</font><br>Исходный путь: ‘.$full_path;
}
?>
<form method=post>
Путь к папке, содержащей папки bitrix и upload: <input name=path value=»<?=htmlspecialchars($path)?>»><br>
<input type=submit value=’Создать’ name=create>
</form>

Скрипт необходимо закачать в корневую папку второго сайта (в нашем случае, example.net), затем после запуска указать путь к корневой папке первого сайта (или папке shared, если ядро находится в ней).
Предположим, первый сайт находится в папке:
/var/www/denis/example.com/www
второй:
/var/www/denis/example.net/www

Записываем скрипт в папку /var/www/denis/example.net/www, в поле путь пишем «../../example.com/www» или «/var/www/denis/example.com/www«. Если всё будет нормально, в папке /var/www/denis/example.net/www появятся нужные символические ссылки.
На этом этапе могут возникнуть проблемы:

  • нет прав на запись в текущую папку;
  • действует ограничение безопасности (open_basedir), которое не позволяет пользователям разделяемого хостинга обращаться к другим сайтам.

В случае возникновения проблем с этим скриптом следует обратиться за помощью к хостеру.
После того как ссылки созданы должно происходить следующее: набираем example.net/bitrix/admin, открывается панель авторизации, вводим данные администратора, которые указывали при установке продукта на example.com и попадаем в административную панель Битрикса.
Поскольку ядро одно и база одна — административная панель для обоих сайтов будет одинаковая (т.е. одна и та же).

Теперь надо скопировать с первого сайта .access.php (чтобы был доступ на чтение корневого раздела, при необходимости можно вручную отредактировать его, удалив всё кроме $PERM["/"]["*"]=»R»;) и index.php (который потом будет редактироваться).

3. Настройка сайтов.

Открываем настройки каждого сайта (Настройки — Настройки продукта — Сайты — Список сайтов), указываем в поле «Доменное имя:» example.com и example.net соответственно для первого и второго сайта.
Последнее, что надо здесь сделать — указать путь на сервере к корневой папке каждого сайта (поле «Путь к корневой папке веб-сервера для этого сайта:») для того чтобы модуль управления структурой построил дерево файлов каждого сайта (меню «Контент»):
указываем /var/www/denis/example.com/www и /var/www/denis/example.net/www соответственно.

4. Проверка публичной части.

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

Код

<?require($_SERVER['DOCUMENT_ROOT'].»/bitrix/header.php»);?>
<? echo «SITE_ID = «.SITE_ID; ?>
<?require($_SERVER['DOCUMENT_ROOT'].»/bitrix/footer.php»);?>

Сохраним в корне обоих сайтов, при обращении к скрипту в домене example.com должен отобразиться идентификатор (двухбуквенное отображение) первого, в домене example.net — идентификатор второго сайта.

Всё. Задача решена.

А если общая корневая папка?

Это не удобно в первую очередь потому что публичная часть сайтов будет общая. Но если другого варианта нет, можно настроить многосайтовость и здесь. Только для разделения публичной части в корне сайта придётся создать папки для каждого сайта и фактически получится многосайтовость по первому способу.

Теперь коротко по шагам. Условия задачи прежние, но будем считать что домены example.com и example.net имеют одну корневую папку /var/www/denis/example

1. Ставим продукт в любом домене один раз.

2. Для разделения публичной части создаём в папке /var/www/denis/example папки com и net. Здесь ядро имеет путь /var/www/denis/example/bitrix для обоих сайтов, и символические ссылки создавать не требуется.

3. В настройках сайтов теперь помимо домена нужно указать папку сайта: /com и /net для первого и второго сайта.

4. Создаём индексную страницу сайта по примеру из учебного курса. Эта страница по домену будет определять текущий сайт и подключать соответствующую публичную часть. Только для этого надо было указать домены в настройках сайтов. Привожу здесь код скрипта:

Код

<?
// подключим файл с классом CMainPage
require($_SERVER['DOCUMENT_ROOT'].»/bitrix/modules/main/include/mainpage.php»);// получим идентификатор текущего сайта по доменному имени
$site_id = CMainPage::GetSiteByHost();

// получим абсолютный путь к индексной странице папки сайта
$page = CMainPage::GetIncludeSitePage($site_id);

// если сайт определен и определена индексная страница то
if(strlen($site_id)>0 && strlen($page)>0)
{
// подключим страницу
require_once($page);
}
else // иначе если сайт не определен то
{
require($_SERVER['DOCUMENT_ROOT'].»/bitrix/header.php»);
// далее можно разместить код который будет отображаться если
// сайт ранее не был определен
?>

<?require($_SERVER['DOCUMENT_ROOT'].«/bitrix/footer.php»);
}
?>

Настройка завершена.

Много поддоменов на одном сайте

К примеру, на сайте пользователи после регистрации получают свой домен вида user.example.com. При обращении к такому домену хотим открывать блог пользователя.

1. Лучше всего в такой ситуации для всех поддоменов использовать отдельную от основной корневую папку сайта. Договариваемся с хостером, что для example.com открывается /var/www/denis/example.com, а для всех поддоменов (за исключением www.example.com) корневой папкой является /var/www/denis/blogs. Ставим Битрикс на example.com.

2. Создаём символьные ссылки как описано выше для многосайтовости по второму способу, но никакую дополнительную настройку Битрикса (как указание доменов в настройке сайта) делать не требуется.

3. Создаём индексную страницу в папке /var/www/denis/blogs, размещаем на ней компонент bitrix:blog.blog. Обратите внимание, это не комплексный компонент блогов, а компонент, отображающий содержимое конкретного блога.

4. На этой же странице перед подключением компонента вставляем код, который будет определять текущий идентификатор блога на примере следующего:

Код

<?
if (!preg_match(«#^www\.([^.]+)\.#»,$_SERVER["HTTP_HOST"],$regs)) // если набрали с «www»: www.user.example.com
preg_match(«#^([^.]+)\.#»,$_SERVER["HTTP_HOST"],$regs);
$BLOG_ID = $regs[1];
?>

Далее в параметрах компонента в качестве идентификатора блога указываем переменную $BLOG_ID. Всё должно работать.

Заключение

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


Комментарии:

Об авторе: admin