Разделы

Реализация многосайтовости на 1.0.2

Цель:
Использовать одну инсталляцию CMS для управления множеством сайтов.

Исходные данные:
два домена site1.ru site2.ru указывают на одну инсталляцию modx 1.0.2
(в apache можно реализовать через ServerAlias, к примеру)

1. mod_rewrite
Включим .htaccess и ЧПУ в админке.
В админке уберем префиксы и суффиксы url, включим использование вложенных url, разрешим повторяющиеся псевдонимы

Далее.
Создаем два ресурса «site1.ru» и «site2.ru» В основном меню ссылки на них должны быть вида (если заходить по домену site1.ru):
site1.ru/site1.ru
site1.ru/site2.ru

Далее. Редактируем файл .htaccess — комментируем третью строку и меняем четвертую:
# For Friendly URLs
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=%{HTTP_HOST}/$1 [L,QSA]


Результат: при заходе по домену site2.ru apache нас направит на наш созданный ресурс — site2.ru. Ура.

2. Ссылки

При построении меню по дочерним ресурсам site2.ru ссылки на эти ресурсы будут вида: "/site2.ru/res1", что после преобразования apache станет «site2.ru/site2.ru/res1» и мы получим 404. Надо сделать так, чтоб ссылки были вида "/res1".

Вариант1. «В лоб».

Правим сниппет вывода меню.

Редактируем файл assets/snippets/wayfinder/wayfinder.inc.php
после строк 381,382:

$tempDocInfo['link'] = $modx->makeUrl($tempDocInfo['id'],'','',$linkScheme);
				}


Добавляем:

$tempDocInfo['link'] =  '/'.substr($tempDocInfo['link'],(strpos($tempDocInfo['link'],'/',2)+1));


Сохраняем, чистим кеш.
Работает!

Вариант 2. (thnks to grinant)

Правим механизм построения ссылок.

Редактируем manager/includes/document.parser.class.inc.php

После строки 1563
$url= $alias . $args;


добавляем

$url = substr($url,(strpos($url,'/')+1));


3. префикс www

При заходе по адресу www.site1.ru получим 404.
Решаем с помощью mod_rewrite:

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^/?(.*) http://%1/$1 [R=301,L]


4. главная страница

При заходе на site1.ru modx нам отобразит содержание ресурса site1.ru, что не очень удобно — т.к. ссылку на этот ресур придется прописывать руками — wayfinder не сгенерирует.

Предлагаю следующее решение: определим что каждый сайт должен иметь главную страницу по url «home/» (т.е. для site1.ru создадим дочерний ресурс с «псевдонимом» home) и сделаем так, чтоб при заходе на site1.ru редиректило на site1.ru/home. Опять mod_rewrite:

RewriteRule ^/?$ /home [R=301,L]


upd. Привожу полный листинг .htaccess файла который получается в итоге.
Options +FollowSymlinks
RewriteEngine On
RewriteBase /

# Fix Apache internal dummy connections from breaking [(site_url)] cache
RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
RewriteRule .* - [F,L]

# Rewrite www.domain.com -> domain.com 
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^/?(.*) http://%1/$1 [R=301,L]

#multisite fix 
RewriteRule ^/?$ /home [R=301,L]

# Exclude /assets and /manager directories from rewrite rules
RewriteRule ^(manager|assets) - [L]


# For Friendly URLs
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
#RewriteRule ^(.*)$ index.php?q=$1 [R,L,QSA]
#multisite fix
RewriteRule ^(.*)$ index.php?q=%{HTTP_HOST}/$1 [L,QSA]


p.s. С MODx познакомился в общих чертах позавчера — не судите строго. revo beta5 не удалось ладом подружить с многосайтовостью (работает- community.modx-cms.ru/blog/documentation/34.html#comment3206, но при таком использовании любые сниппеты выдают ошибку), поэтому решил попробовать реализовать многосайтовость на стабильной версии.

  • +11
  • 22 ноября 2009, 00:06
  • nep

Комментарии (49)

RSS свернуть / развернуть
+2
2. wayfinder

Надо сделать так, чтоб ссылки были вида "/res1". Для этого придется лезть в сниппет вывода меню. Я взял wayfinder.


вы не туда полезли, Вам надо лезть в makeUrl иначе ссылки вида [~id~] также не будут обрабатываться.

а так в целом хороший топик. плюсанул.
avatar

grinant

  • 22 ноября 2009, 06:35
0
Спс за наводку. Переделаю.
avatar

nep

  • 22 ноября 2009, 11:09
0
и топик заодно :)
avatar

grinant

  • 22 ноября 2009, 12:03
0
готово.
avatar

nep

  • 22 ноября 2009, 13:15
0
Лихо вы его! =)
avatar

pitbull

  • 22 ноября 2009, 10:33
0
ну да… для очень хорошая реализация :-) всего то надо — ничего… :)
как раз клепать сайты по 1000 руб за штуку… по моему ваще много ума для MODx в этом плане не надо :-)… сделал шаблоны главной + второстепенной + обратной связи… в каждый засунул путь к файликам картинок и т.п. в виде TV-параметра… и сиди клепай страницы одинаковой верстки разного оформления :)… хороша идея? правда?

надо бы так попробовать :-)
avatar

grinant

  • 22 ноября 2009, 12:01
0
Это вы к чему, уважаемый?
avatar

pitbull

  • 22 ноября 2009, 12:06
0
это я к тому что надо сделать систему из шаблонных страниц… и клепать сайты-визитки по 1000 руб :)
avatar

grinant

  • 22 ноября 2009, 12:21
0
Вам помощь в этом начинании нужна или что?

Не понял, если честно вашей тирады в ответ на мое сообщение, адресованное не вам к тому же.
avatar

pitbull

  • 22 ноября 2009, 12:32
0
Он, видимо, имеет в виду, что можно поставить один движок modx, написать один шаблон и ставить на этот движок сколько угодно небольших простеньких сайтов, меняя разве что дизайн через css, и все)
avatar

Indra

  • 26 ноября 2009, 11:21
0
Да… таких «клепателей» все больше и больше))) Качеством берите, господа!
avatar

dozen

  • 7 марта 2010, 19:43
0
Хороший топик, уметь бы и мне так за два-три дня разбираться в вещах (я помню не очень быстро в суть вещей МОДх вник :) ). Да и не просто разбираться, а ещё и придумывать серьёзные модификации.

А по поводу Рево — ну от беты пока требовать работоспособности не стоит.
Кстати, а где это вы бета-5 взяли? Из SVN?
avatar

iJack

  • 22 ноября 2009, 14:24
0
Для подобной модификации всю суть понимать необязательно :). Я для того и описал — чтоб подсказали — может где косяк (так и получилось). Трюк с mod_rewrite давно придумал, просто не было подходящей cms чтоб проверить.

бету 5, ага, из svn
avatar

nep

  • 22 ноября 2009, 18:11
0
Да, полезно знать серверные технологии…
avatar

Solo

  • 23 ноября 2009, 05:27
0
По-моем вот это лучше modxcms.com/extras/package/433
avatar

Andchir

  • 25 ноября 2009, 09:49
0
На сколько я понял из описания этого расширения — для каждого домена необходимо создавать конфиг файлы. И админки будут тоже разные — т.е. чтоб отредактировать другой сайт будет нужно лезть в другую админку.

Это решает вопрос единой инсталляции для нескольких сайтов, но не достигает цели редактирования нескольких сайтов из одной админки.
avatar

nep

  • 25 ноября 2009, 10:40
0
Но несколько сайтов в одной админке (общая БД, общий кэш-файл) тоже не хорошо.
avatar

Andchir

  • 25 ноября 2009, 11:09
0
кэш-файл, ага — похоже может доставить проблем при большом суммарном количестве страниц.
А в остальном — ради того и делал, чтоб была общая БД и общая админка.
avatar

nep

  • 25 ноября 2009, 12:03
+1
в Рево кажется есть специальная встроенная функциональность для этого — без всякого редактирований модреврайта. Там есть специальное понятия для этого — «Контекст», и разные сайты на одном движке могут быть в разных контекстах, или же, это может быть один сайт, но разные контексты могут быть разные для разных пользователей, и прочее. А так же система пространства имен есть.
avatar

Indra

  • 26 ноября 2009, 11:27
0
Да, я смотрел и тестировал. Однако пока удовлетворительного результата не достиг (см p.s. к топику). Когда будет релиз — тогда ясно дело все эти огороды уже не потребуются.
avatar

nep

  • 26 ноября 2009, 12:29
0
Тема реальная у меня даже есть домен
давай попробуем
tiparepa.ru там правда социал енжин стоит, но если кто то возмется легко снесу, и сделаю экспериментальным без ограничения( с доступом для всех, для некоторых, без ограничений) все одно не занимаюсь(пустует)
предлагайте
avatar

1234

  • 10 декабря 2009, 07:14
0
Это вы ерундой занимаетесь :) Тут, я думаю, у всех есть 1-2 тестовых домена. Да и субдомены ещё ни кто не отменял.
avatar

ManManovich

  • 14 января 2010, 20:19
0
Результат: при заходе по домену site2.ru apache нас направит на наш созданный ресурс — site2.ru. Ура.


Так вот сразу и перенаправит. :) Там же в папочке с доменом site2.ru надо редирект оставить. А как правильно это сделать? Чего там в .htaccess написать надо?
avatar

ManManovich

  • 14 января 2010, 20:55
0
Уже нашёл.
RedirectPermanent / http://all.kiberguru.ru
avatar

ManManovich

  • 14 января 2010, 21:10
0
Неа. Чёто не работает… :(
avatar

ManManovich

  • 14 января 2010, 21:18
0
не так.
надо сразу в конфиге апача указать, что site2.ru лежит в папке site1.ru.
avatar

nep

  • 15 января 2010, 08:04
0
Вот у меня хостинг. Меня ж ни кто не пустит к конфигу апача. :(
Хорошо, а что надо написать там чтоб работало?

Нашёл у себя в cpanel «настройки домена» там можно через кнопочки включить/настроить несколько функций. Внизу генерируется текст который по своей форме очень напоминает конфиг апача. Есть там функция «переадресация» она в этот текст добавляет тоже
Redirect permanent / http://sub.domain.ru


Правда не работает вообще :(

С другой стороны .htaccess это тоже же конфиг апача, только предназначеный для индивидуальную пастройку доменов, чтоб всем подряд на лазить в общий конфиг. По идее через него как-то же можно объяснить как сделать редирект, чтоб работало.
avatar

ManManovich

  • 15 января 2010, 09:41
0
О. Опять плохо подумал прежде чем написать. А можно это как-то обыграть через нс сервер? Чтоб на уровне записи перекидывало на другой домен?
avatar

ManManovich

  • 15 января 2010, 09:43
0
нет нет… такие хитрости работать не будут.
я с хостингами не работал, поэтому не знаю где конкретно что настроить, но по логике, должна быть настройка указывающая к какой папке прикреплен сайт по домену. нужно указать одну и ту же папку для обоих доменов.

ну или наоборот — прикрепить к одной папке два домена.
avatar

nep

  • 15 января 2010, 10:07
0
nep, спасибо за задумку, есть вопрос: сделал все по инструкции на Хостинге, но есть одна нипонятная трабла…
определим что каждый сайт должен иметь главную страницу по url «home/»

ага делаю, только для первого сайта все норм и редирект срабатывает на страничку home, а для второго нет, не срабатывает, и если у второго сайта УРЛ site2.ru, то открывается site1.ru/ite2.ru (именно без первой буквы в домене) вместо site2.ru/home

Обоим доменам указано что они находятся в одной и тойже папке на хостинге… что не так сделал? могу показать на примере в инете… как раз тестирую, но никак не получается
avatar

jeff-sett

  • 1 февраля 2010, 18:07
0
причем такая путаница (исчезновение первой буквы домена) происходит только после добавления в файл
manager/includes/document.parser.class.inc.php
После строки 1563
$url= $alias. $args;
добавляем
$url = substr($url,(strpos($url,'/')+1));


и при заходе на сайт site2.ru не ридеректит на /home =(((
avatar

jeff-sett

  • 1 февраля 2010, 19:53
0
Редирект на /home — функция вэб сервера. Изменения php кода никак не может на ней отразиться.
Почему так происходит… хз. Выложите .htaccess файл — попробую помочь.
avatar

nep

  • 2 февраля 2010, 07:08
0
после обновления NS сервера все чудным образом заработало :)
avatar

jeff-sett

  • 2 февраля 2010, 09:15
0
итак все равно замечены баги… толи моих кривых рук, о втором не хочется думать… вот файл .htaccess

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

# Fix Apache internal dummy connections from breaking [(site_url)] cache
RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
RewriteRule .* - [F,L]

# Exclude /assets and /admin directories from rewrite rules
RewriteRule ^(manager|assets) - [L]

# # Multidomens fix 1 - For Friendly URLs
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?q=%{HTTP_HOST}/$1 [L,QSA]

# Multidomens fix 2 - prefix WWW
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^/?(.*) http://%1/$1 [R=301,L]

# Multidomens fix 3 - Redirect home
RewriteRule ^/?$ /home [R=301,L]


и все бы хорошо… но при наборе сайта например site1.ru — все гууд, а если www.site1.ru то в адресной строке появляется сразу же такая конструкция site1.ru/index.php?q=www.site1.ru/ и со вторым доменом аналогичная байда… и в обоих случаях открывается страница с id=1, т.к. она прописана в настройках как 404 и 403 ошибка… в самой админке… что я не так сделал ?? помогите — очень хочу разобраться — голову уже сломал и так и эдак переделывал…
avatar

jeff-sett

  • 2 февраля 2010, 23:39
0
блин… актуально до сих пор — подскажите плизз что не так?
avatar

jeff-sett

  • 4 февраля 2010, 21:02
0
от без исходности ковырялся сам… пришел к такому моменту: при следующем содержании файла .htaccess получаем переадресацию с домена www.site1.ru на site1.ru, а всего лишь поменял местами записи порядком

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

# Fix Apache internal dummy connections from breaking [(site_url)] cache
RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
RewriteRule .* - [F,L]

# Exclude /assets and /admin directories from rewrite rules
RewriteRule ^(manager|assets) - [L]

RewriteRule ^/?$ /home [R=301,L]

RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^/?(.*) http://%1/$1 [R=301,L]

# For Friendly URLs
RewriteCond %{REQUEST_FILENAME} !-f
#RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=%{HTTP_HOST}/$1 [L,QSA]
avatar

jeff-sett

  • 4 февраля 2010, 22:04
0
как сделать наоборот, чтобы с домена site1.ru перекидывало на www.site1.ru ???
avatar

jeff-sett

  • 4 февраля 2010, 22:05
0
Погляжу на выходных. Счаз завал на работе.
avatar

nep

  • 12 февраля 2010, 12:07
0
спасибо… буду очень признателен :) жду с нетерпением :)
avatar

jeff-sett

  • 12 февраля 2010, 12:11
0
По первому: порядок правил важен. Извиняюсь, что не указал это в исходной статье. Но, как понял, с этим справились.

По второму: можно решить задачу заменив аналогичные правила на следующие:
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^/?(.*) http://www.%1/$1 [R=301,L]

статью поправлю — включу полный листинг .htaccess файла.
avatar

nep

  • 13 февраля 2010, 19:14
0
а ты пробовал эту конструкцию ???
после внесения такой правки в браузере происходит перенаправление на «www..com/» — имено вот так как написал =)…
avatar

jeff-sett

  • 14 февраля 2010, 12:41
+1
видимо ошибся где то при копировании, но вчера какая-то подобная конструкция работала. сейчас не могу повторить :)

Впрочем, вот такой вариант работает
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^/?(.*) http://www.%{HTTP_HOST}/$1 [R=301,L]
avatar

nep

  • 14 февраля 2010, 17:51
0
СПАСИИИИБОООО!!! аллилуя )) хвала небесам… есть только небольшое уточнение… предлагаю его добавить в саму статью: если мы хотим сделать сайт с префиксом www то мы должны использовать в файле .htaccess вот такую запись и «Псевдоним» для сайта делать тоже с www, т.е. псевдонимы для site1.ru и site2.ru будут www.site1.ru www.site2.ru иначе будет отдавать страницу 404 :)
avatar

jeff-sett

  • 14 февраля 2010, 18:01
0
есть вопрос: если я при реализации многосайтовости ставлю ссылку вот таким образом [~id~] то получаю на сайте такую конструкцию:

ввв.имя-сайта.ру/ввв.имя-сайта.ру/id

Как исправить ???
avatar

jeff-sett

  • 18 февраля 2010, 16:00
+1
Вариант 2. (thnks to grinant)

Правим механизм построения ссылок.

Редактируем manager/includes/document.parser.class.inc.php

После строки 1563
$url= $alias. $args;

добавляем

$url = substr($url,(strpos($url,'/')+1));
avatar

pitbull

  • 10 марта 2010, 18:29
0
ну так именно таким способом и делалось…
или нужно было использовать оба варианта ??? я использовал только «Вариант 2. (thnks to grinant)»
avatar

jeff-sett

  • 18 марта 2010, 21:04
0
Блин… кто-нибудь пытался то реализовать хоть пару сайтов по такой системе ?? или я один как дурак с этим копаюсь ??? :)

Редактируем manager/includes/document.parser.class.inc.php
После строки 1563
$url= $alias. $args;
добавляем
$url = substr($url,(strpos($url,'/')+1));

Не работает — увы… могу показать сайты в личку… Вайфайндер пашет — Дитто нет, конструкция [~id~] тоже не пашет — ставлю ссылки руками — если страниц 5-10 не критично… а дальше жопа — все страницы в голове держать ?:)
avatar

jeff-sett

  • 6 апреля 2010, 11:32
0
У меня такая же проблема. Делал все по вашему методу =). Но ссылки [~id~] все равно генерируются в таком виде site1.ru/site1.ru/. Помогите пожалуйста!
avatar

Simpo

  • 4 мая 2010, 11:11
0
забудь про этот метод -)))) тут каши не сваришь. Есть другой вариант создания многосайтовости, я его отмел, т.к. мануал был на английском языке, но т.к. в этой ветке никто не помогает — пошел переводить и пробовать… Вот ссылка (в данный момент настроил на хостинге и подключил два сайта, Ditto+Wifaynder+BreadCrumbs — работают, ну и конечно же ссылки вида [~id~]) — вот линк
avatar

jeff-sett

  • 7 мая 2010, 15:53

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.