Дата последнего изменения: 21.10.2017
Технически возможны (но не рекомендуется к использованию) варианты псевдомногосайтовости, реализованные внешне как на разных доменах, но фактически обслуживаемые одним сервером Apache. При использовании этой возможности невозможно в административной части разделить данные по сайтам: форумы, блоги, рассылки и прочее будут отображаться вместе.
Многосайтовость реализуется в этом случае за счет кода индексной страницы основного сайта.
Особенностью этого метода является то, что в случае ошибочных указаний адресов возможны ситуации, когда, например, будет отображен контент одного сайта в шаблоне другого.
Настройка сервера производится аналогично настройкам многосайтовости на одном домене.
Настройки сайтов производятся аналогично настройкам многосайтовости на одном домене с той лишь разницей что в поле Доменное имя каждого сайта указываются собственные доменные имена для каждого сайта.
Посетитель каждого из сайтов, заходя по адресу http://www.site1.com или http://www.site2.com, попадает фактически на страницу /index.php
, лежащую в каталоге, указанном в параметре DocumentRoot настроек веб-сервера. В многосайтовой конфигурации роль этого файла немного меняется, и в нем необходимо разместить уже не содержимое индексной страницы корня одного из сайтов, а PHP код, осуществляющий выбор одного из сайтов в зависимости от текущего доменного имени.
При решении данной задачи могут быть использованы следующие функции класса CMainPage:
Accept-Language
в настройках браузера пользователя. когда сайт определяется по текущему доменному имени:
<?
// подключим файл с классом 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");
}
?>
Этот пример кода определяет доменное имя, по которому пришел посетитель, используя функцию CMainPage::GetSiteByHost, сверяет это доменное имя с именами, указанными в настройках сайтов в поле Доменное имя для определения ID сайта и производит включение в тело документа индексной страницы из папки соответствующего сайта, используя функцию CMainPage::GetIncludeSitePage.
В нашем примере это будет означать, что посетителю, пришедшему по адресу http://www.site1.com прямо в теле текущей страницы без редиректа будет представлена страница /s1/index.php
. А посетителю, пришедшему по адресу http://www.site2.com - страница /s2/index.php
.
Использование приведенного алгоритма позволяет избежать редиректов для пользователей и поисковых роботов, обеспечивает удобную работу c многосайтовой конфигурацией. Данный алгоритм является рекомендуемым, но не единственным при работе с многосайтовой версией.
когда сайт определяется по установленным в браузере посетителя языкам:
<?
// подключим файл с классом CMainPage
require($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/include/mainpage.php");
// получим идентификатор сайта по Accept-Language
$site_id = CMainPage::GetSiteByAcceptLanguage();
// если сайт определен, то
if(strlen($site_id)>0)
{
// перенаправим на индексную страницу сайта
CMainPage::RedirectToSite($site_id);
}
else // иначе если сайт не определен то
{
require($_SERVER['DOCUMENT_ROOT']."/bitrix/header.php");
// далее можно разместить код который будет отображаться если
// сайт ранее не был определен
?>
<?require($_SERVER['DOCUMENT_ROOT']."/bitrix/footer.php");
}
?>
В этом примере кода функция CMainPage::GetSiteByAcceptLanguage проверяет, какие языки установлены в настройках браузера посетителя, сравнивает с ID языка сайта и возвращает наиболее подходящий сайт.
После того, как сайт будет определен, функция CMainPage::RedirectToSite выполнит редирект (302 ответ веб-сервера) и переведет пользователя на индексную страницу папки указанного сайта, например, по адресу http://www.site1.com/s1/ или http://www.site2.com/s2/.
когда один из сайтов расположен в корне, остальные - в папках, но при этом хосты у сайтов одинаковые:
<?
// подключим файл с классом CMainPage
require($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/main/include/mainpage.php");
// получим идентификатор текущего сайта по доменному имени
$mainpage_siteid = CMainPage::GetSiteByHost();
//если текущим сайтом является s2, то получим абсолютный путь к индексной странице папки сайта
if ($mainpage_siteid != "s1" && $page = CMainPage::GetIncludeSitePage($mainpage_siteid)):
// подключим страницу
require_once($page);
die();
endif;
require($_SERVER['DOCUMENT_ROOT']."/bitrix/header.php");
// далее можно разместить обычный текст индексной страницы,
//которая будет подключаться, если активен тот сайт, который в корне ?>
<?require($_SERVER['DOCUMENT_ROOT']."/bitrix/footer.php");
?>
В нашем примере если сайтом "по умолчанию" (из настроек сайтов) является /s2
, то его индексная страница и будет вызвана.
Если ваши сайты являются, по сути, разными международными языковыми зеркалами, то вы можете использовать вариант определения сайта по установленным в браузере посетителя языкам.
Если домены и дизайны двух сайтов разные, и используется одна база для двух сайтов (настройки магазина и т.д. тоже одинаковые), можно использовать такой вариант. Лицензия на второй сайт при этом не используется.
Решение:
strpos($_SERVER["HTTP_HOST"], 'domain1.ru')!==false
strpos($_SERVER["HTTP_HOST"], 'domain2.ru')!==false
Настройка сервера производится аналогично настройкам многосайтовости на одном домене.