Мультисайтинг (одни файлы, разные базы)

18.12.2017

Для первой статьи возьмем самый простой вариант — с общими файлами, тем более это востребованный вариант. Многие друпалеры имеют несколько своих сайтов и обновление ядра/модулей занимает ценное время. Гораздо удобнее посадить все сайты в одну папку с файлами, тем самым упростить обновление кода.

Допустим мы имеем 2 сайта, с разными темами и такими модулями:

  • www .blogmy .ru — наш блог, который использует стандартные модули, views, xmlsitemap.
  • www .portfoliomy .ru — наше портфолио, которое использует стандартные модули, xmlsitemap, webform, imageapi.

Создаем на сервере папочку для сайтов — multisite/www/ это корневая папка обоих сайтов. В панели управления сервера на хостинге создаем первый домен и направляем его в нашу папку и точно также создаем второй домен указывая опять папку multisite/www/. В случае виндовс (локального сервера) создаем виртуальный хост с алиасами двоих доменов, например так:

DocumentRoot "D:/web/sites/multisite/www"
ServerName "blogmy.ru"
ServerAlias "www.blogmy.ru" "portfoliomy.ru" "www.portfoliomy.ru"

Проводим обычную процедуру копирования файлов Друпала в multisite/www/, модулей, тем, создание базы данных и инсталляцию сайта. В результате у нас должен получиться обычный сайт под управлением Друпала.
Теперь переделаем сайт так что бы он работал только на нашем домене для блога. Для этого создаем копию папки default (multisite/www/sites/default) в директории /sites/, новое имя папки должно совпадать с именем домена, т.е. у нас должна появится папка multisite/www/sites/blogmy.ru/, после этого удаляем из папки /default/ все файлы кроме default.settings.php (в таком виде она была при инсталляции Друпала).
Сейчас сайт блога должен работать и все свои данные сохранять в папку multisite/www/sites/blogmy.ru/

Переходим к сайту портфолио. Файлы самого Друпала у нас уже есть, из дополнительных модулей уже есть xmlsitemap в папке с модулями, поэтому копируем только недостающие модули.
Следующим шагом создаем папку для настроек multisite/www/sites/portfoliomy.ru/ и дальше действуем по стандартной процедуре, копируем отсюда файл default.settings.php и переименовываем его в settings.php и запускаем процедуру установки друпала. Теперь у нас два сайта которые используют одни файлы и разные базы данных.

Тонкости и дополнительная информация

Почитать дополнительно можно в первоисточнике файле Install.txt в архиве Друпала, я лишь только приведу небольшой кусочек текста и рассмотрю его:

When searching for a site configuration (for example www.sub.example.com/site3), Drupal will search for configuration files in the following order, using the first configuration it finds:

sites/www.sub.example.com.site3/settings.php
sites/sub.example.com.site3/settings.php
sites/example.com.site3/settings.php
sites/www.sub.example.com/settings.php
sites/sub.example.com/settings.php
sites/example.com/settings.php
sites/default/settings.php

Тут показано как CMS Drupal будет искать папку с настройками для сайта www.sub.example.com/site3, все достаточно понятно и объясняет почему без мультисайтинга используется папка sites/default/, потому что она обработается для любого домена, если других папок нет – универсальная папка.
Также стоит обратить внимание на такой момент как папки:
sites/www.sub.example.com/ и sites/sub.example.com/ — Друпал их считает разными сайтами, хотя обычно это один и тот же сайт. Поэтому следует создавать папку вида sites/sub.example.com/ тогда пользователи смогут обращаться к вашему сайту с www и без него.

Еще один ньюанс это папка files – для файлов, по умолчанию Друпал ее создает в sites/default/files, а в случае нашего примера для блога она будет как sites/blogmy.ru/files, а для портфолио sites/portfoliomy.ru/files. Если вы захотите объединить эти папки, то лучше этого не делать могут быть проблемы. Как пример можем рассмотреть модуль xmlsitemap, при объединение папок у вас будет один файл карты сайта, что очень плохо потому что он предоставляет неверную информацию.

Недостаток одинаковых файлов системы также проявляется в дублировании файлов .htaccess и robots.txt, иногда нужно иметь для каждого сайта свой robots.txt. Но при небольшой модификации можно получить разные robots.txt для разных сайтов.
Можно использовать готовый модуль RobotsTxt http://drupal.org/project/robotstxt или произвести ручные правки:
В корневой папке создаем файл robots.php (у нас multisite/www/robots.php)
<?php
header('Content-type: text/plain');
$robotstxt = "sites/" . $_SERVER['HTTP_HOST'] . "/robots.txt";
echo file_get_contents($robotstxt);
?>
и для папки с настройками каждого сайта копируем свою версию robots.txt (для блога multisite/www/sites/blogmy.ru/robots.txt).
В файл .htaccess дописываем такую строку:
RewriteRule ^robots.txt$ http://%{HTTP_HOST}/robots.php [R=302,L]
Эта конструкция будет переправлять запросы поисковиков в папку с необходимым файлом.
(вычитано преимущественно тут)