Мультидоменность контекстами
В сообществе часто проскакивают вопросы про мультидоменность на одной копии MODX. А у меня, как раз, сайты демо версий компонентов реализованы таким образом. Думаю, информация будет полезной!
На самом деле, сделать это контекстами достаточно просто. Буквально в три шага.
Шаг 1
Создаем плагин switchContextDomain на событие OnMODXInit:if ($modx->event->name != 'OnMODXInit' || $modx->context->key == 'mgr') {
return;
}
if ($host = str_replace('www.', '', $_SERVER['HTTP_HOST'] ?: $_SERVER['SERVER_NAME'])) {
// Выбираем контексты с настройкой http_host
$q = $modx->newQuery('modContextSetting', array('key' => 'http_host', 'value:!=' => ''));
$q->select('context_key as ctx, value as host');
$tstart = microtime(true);
if ($q->prepare() && $q->stmt->execute()) {
// Учитываем наш запрос в БД
$modx->queryTime += microtime(true) - $tstart;
$modx->executedQueries++;
while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
// Если нашли нужный контекст - переключаем на него
if ($row['host'] == $host) {
$modx->switchContext($row['ctx']);
break;
}
}
}
}
Шаг 2
Назначаем контексту web настройки:http_host = domain1.ru
site_start = ID главного ресурса в текущем контексте
site_url = http://domain1.ru/
Шаг 3
Назначаем контексту domain2 настройки:http_host = domain2.ru
site_name = Название второго сайта
site_start = ID главного ресурса в текущем контексте
site_url = http://domain2.ru/
Итого
Как видите, все довольно просто, что называется, до безобразия!
Поблагодарить автора
Отправить деньги
Комментарии: 26
Есть один нюанс из-за которого я не назначаю контексту web настройку site_url:
При мультидоменности в админку можно зайти по любому из доменов. И вот, если мы открыли сайт domain2.ru, зашли в его админку, что-то отредактировали и хотим перейти на сам сайт, выбираем «Содержимое» -> «Перейти на сайт».
В этом случае, если у контекста web есть настройка site_url, открывается сайт domain1.ru. Если же у контекста web настройки site_url нет, то мы перейдём на тот домен, по которому мы открыли админку.
При мультидоменности в админку можно зайти по любому из доменов. И вот, если мы открыли сайт domain2.ru, зашли в его админку, что-то отредактировали и хотим перейти на сам сайт, выбираем «Содержимое» -> «Перейти на сайт».
В этом случае, если у контекста web есть настройка site_url, открывается сайт domain1.ru. Если же у контекста web настройки site_url нет, то мы перейдём на тот домен, по которому мы открыли админку.
Сорри, это я минуснул. Пальцами на мобиле не попал, а, к сожалению, не исправить. Вот бы в течение 10 минут была возможность переголосовать…
Спасибо за информацию!
Спасибо за информацию!
Я плюсанул, не переживай.
Добрый день!
Раз уж тема про мультидоменность контекстами, можно вопрос задам.
Если у нас поддомены отвечают за города, типа:
moscow.site.ru, spb.site.ru,…
С помощью какого дополнения или скрипта можно реализовать автоматическое перенаправление на поддомен с нужным городом, с основного сайта site.ru.
Кто как реализовывал определение геолокации из браузера и перенаправление? Поделитесь опытом.
Раз уж тема про мультидоменность контекстами, можно вопрос задам.
Если у нас поддомены отвечают за города, типа:
moscow.site.ru, spb.site.ru,…
С помощью какого дополнения или скрипта можно реализовать автоматическое перенаправление на поддомен с нужным городом, с основного сайта site.ru.
Кто как реализовывал определение геолокации из браузера и перенаправление? Поделитесь опытом.
У Володи есть компонент геоип, я им пользовался для определения города.
Спасибо!
Спасибо!
Про алиасы www забыли?
Не понял.
www никуда не делся. Переадресовываем мы его.
Можно подробнее, что вас именно смущает?
Не вижу куда алиас добавить. Порядок переадресаций оставим пока на серверной стороне.
Вот эта строчка:
str_replace('www.', '', $_SERVER['HTTP_HOST'] ?: $_SERVER['SERVER_NAME'])
отвечает за то, чтобы вырезать из домена www и никаких алиасов вписывать не нужно.
А если переход с www?
Ну перепишите под себя, в чем проблема? Тем более, что правок в плагине ровно в одну строчку. :)
Не годится. ИМХО
Добрый день. Реализация отличная. Но у меня возник такой вопрос:
1. Физически поддомен создавать не нужно?
2. Как быть с https, ведь бесплатные сертификаты типа LEt's Encrypt не обеспечивают безопастность поддомена, а значит, нужно создавать поддомен и к нему делать сертификат. А при наличии физически созщданного поддомена у меня просто отображает страницу поддомена, без работы плагина. Как тут выкрутиться?
1. Физически поддомен создавать не нужно?
2. Как быть с https, ведь бесплатные сертификаты типа LEt's Encrypt не обеспечивают безопастность поддомена, а значит, нужно создавать поддомен и к нему делать сертификат. А при наличии физически созщданного поддомена у меня просто отображает страницу поддомена, без работы плагина. Как тут выкрутиться?
Физически — это как? Я пользуюсь pdd.yandex.ru и там очень просто добавить поддомен и сослаться с него на нужный IP. Собственно, этого достаточно для работы метода. Хотя, если на сервере NGINX + PHP-FPM, то в конфиге NGINX необходимо прописать и поддомен.
Я тоже делаю через pdd.yandex.ru и там я добавляю просто A записи поддомена. Но вот сертификат я ему не могу присвоить, правильно? Без создания поддомена в панели хостинга.
А вот тут я вам уже не помогу. Хостинги бывают разные. На modhost, насколько я помню, вполне возможно привязать к одному сайту несколько доменов и даже создать для них сертификаты автоматически.
А кто-нибудь с правами заморачивался, чтобы при открытии админки открывались не все контексты, а только тот, на домене которого открывается админка?
В чём может быть проблема?, Вместо поддомена перекидывает на основной сайт.
Ребята подскажите в чем может быть проблема.
Создал контекст web2, ввел настройки — работает.
Создал контекст web3, ввел для него настройки — Не работает.
При переходе по домену контекста — ошибка 503. страница недоступна.
Главная контекста — опубликована
Создал контекст web2, ввел настройки — работает.
Создал контекст web3, ввел для него настройки — Не работает.
При переходе по домену контекста — ошибка 503. страница недоступна.
Главная контекста — опубликована
Дело было в папке cashe
Вопрос возник, а как правильно подключить разные счетчики метрики для разных контекстов?
Первое что пришло на ум, это создать настройку в контексте — номер счетчика, и подставлять его в коде метрики.
Первое что пришло на ум, это создать настройку в контексте — номер счетчика, и подставлять его в коде метрики.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.