14  /  26

Псевдомногосайтовость на разных доменах

Просмотров: 5655 (Статистика ведётся с 06.02.2017)
Дата последнего изменения: 21.10.2017
Роберт Басыров
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
3
4
5

Технически возможны (но не рекомендуется к использованию) варианты псевдомногосайтовости, реализованные внешне как на разных доменах, но фактически обслуживаемые одним сервером Apache. При использовании этой возможности невозможно в административной части разделить данные по сайтам: форумы, блоги, рассылки и прочее будут отображаться вместе.

Первый вариант

Многосайтовость реализуется в этом случае за счет кода индексной страницы основного сайта.

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

Настройка сервера Apache

Настройка сервера производится аналогично настройкам многосайтовости на одном домене.

Настройки сайта

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

Настройка индексной страницы

Посетитель каждого из сайтов, заходя по адресу http://www.site1.com или http://www.site2.com, попадает фактически на страницу /index.php, лежащую в каталоге, указанном в параметре DocumentRoot настроек веб-сервера. В многосайтовой конфигурации роль этого файла немного меняется, и в нем необходимо разместить уже не содержимое индексной страницы корня одного из сайтов, а PHP код, осуществляющий выбор одного из сайтов в зависимости от текущего доменного имени.

При решении данной задачи могут быть использованы следующие функции класса CMainPage:

  • CMainPage::GetSiteByHost - возвращает ID сайта, определяя его по текущему доменному имени.
  • CMainPage::GetSiteByAcceptLanguage - возвращает ID сайта, определяя его по переменной Accept-Language в настройках браузера пользователя.
  • CMainPage::GetIncludeSitePage - возвращает абсолютный путь на индексную страницу папки указанного сайта, для дальнейшего его подключения.
  • CMainPage::RedirectToSite - перенаправляет на индексную страницу папки указанного сайта.
Пример индексной страницы портала,

когда сайт определяется по текущему доменному имени:

 <?
// подключим файл с классом 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, то его индексная страница и будет вызвана.

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

Второй вариант

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

Решение:

  1. Перейдите в Настройки сайта (Рабочий стол > Настройки > Настройки продукта > Сайты > Список сайтов)
  2. Установите для первого шаблона Тип условия = Выражение PHP. В условие пишите:
    strpos($_SERVER["HTTP_HOST"], 'domain1.ru')!==false
  3. Установите для второго шаблона Тип условия = Выражение PHP. В условие пишите:
    strpos($_SERVER["HTTP_HOST"], 'domain2.ru')!==false
  4. В поле Доменное имя: (список доменных имен, каждое в новой строке) - прописываете оба домена.

Настройка сервера производится аналогично настройкам многосайтовости на одном домене.

21
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии