Просмотров: 47185
Дата последнего изменения: 02.07.2020
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
4
5
Технически возможны (но не рекомендуется к использованию) варианты псевдомногосайтовости, реализованные внешне как на разных доменах, но фактически обслуживаемые одним сервером Apache. При использовании этой возможности невозможно в административной части разделить данные по сайтам: форумы, блоги, рассылки и прочее будут отображаться вместе
Первый вариант
Многосайтовость реализуется в этом случае за счет кода индексной страницы основного сайта.
Но в случае ошибочных указаний адресов возможны ситуации, когда, например, будет отображен контент одного сайта в шаблоне другого.
Настройка сервера Apache
Настройка сервера производится аналогично настройкам многосайтовости на одном домене.
Настройки сайта
Настройки сайтов производятся аналогично настройкам многосайтовости на одном домене с той лишь разницей что в поле Доменное имя каждого сайта указываются собственные доменные имена для каждого сайта.
Настройка индексной страницы
Посетитель каждого из сайтов, заходя по адресу http://www.site1.com или http://www.site2.com, попадает фактически на страницу /index.php
, лежащую в каталоге, указанном в параметре DocumentRoot настроек веб-сервера. В многосайтовой конфигурации роль этого файла немного меняется, и в нем необходимо разместить уже не содержимое индексной страницы корня одного из сайтов, а PHP код, осуществляющий выбор одного из сайтов в зависимости от текущего доменного имени.
При решении данной задачи могут быть использованы следующие функции класса CMainPage:
Пример индексной страницы портала, когда сайт определяется по текущему доменному имени
|
<? // подключим файл с классом 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 , то его индексная страница и будет вызвана.
Если ваши сайты являются, по сути, разными международными языковыми зеркалами, то вы можете использовать вариант определения сайта по установленным в браузере посетителя языкам.
|
Второй вариант
Если домены и дизайны двух сайтов разные, и используется одна база для двух сайтов (настройки магазина и т.д. тоже одинаковые), можно использовать такой вариант. Лицензия на второй сайт при этом не используется.
Решение:
- Перейдите в Настройки сайта (Рабочий стол > Настройки > Настройки продукта > Сайты > Список сайтов)
- Установите для первого шаблона Тип условия = Выражение PHP. В условие пишите:
strpos($_SERVER["HTTP_HOST"], 'domain1.ru')!==false
- Установите для второго шаблона Тип условия = Выражение PHP. В условие пишите:
strpos($_SERVER["HTTP_HOST"], 'domain2.ru')!==false
- В поле Доменное имя: (список доменных имен, каждое в новой строке) - прописываете оба домена.
Настройка сервера производится аналогично настройкам многосайтовости на одном домене.