[EVO] Города-поддомены

Задача — сделать сайт, в котором каждый город — это поддомен, которому соответствует свой мини-сайт. Т.е. структура примерно такая
city
— about
— services
— service1
— service2
city1
— about
— services
— service1
— service2
city2
— about
— services
— service1
— service2

сайт города city — по умолчанию (он без домена). Так вот задача чтобы мы по адресу site.ru получали сайт для города city, по адресу city1.site.ru получали сайт для города city1, а по адресу city2.site.ru получали сайт для города city2. При этом страницы О нас имеют для каждого сайта адреса
site.ru/about.html
city1.site.ru/about.html
city2.site.ru/about.html

а страница например услуги 2 для разных городов имеет вид
site.ru/services/service2.html
city1.site.ru/services/service2.html
city2.site.ru/services/service2.html

При этом все находится в одной админке и админ созданием папки в корне сайта автоматом создает новую ветку на новом поддомене.

В целом — понадобилось не так уж много:

1. настройка на самом хостинге — т.е. все поддомены должны быть псевдонимами для основного домена *.domain.com = alias domain.com — чтобы они все смотрели в одну папку
2. небольшие правки в файл htaccess (прямо перед блоком # For Friendly URLs)

# without www  all domian - перенаправляем все на "без www"
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]

#correct robots.txt, можно и для sitemap.xml такое же сделать - чтобы на каждый поддомен отдавался свой файл соответствующего хоста
RewriteCond %{HTTP_HOST} ^([a-zA-Z\-]+).site\-example\.com$ [NC]
RewriteRule ^robots.txt robots-%1.txt [L]

# subdomains to domain - перенаправляем запрос к поддомену на запрос в соответсвующую папку
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^([a-zA-Z\-]+).site\-example\.com$ [NC]
RewriteRule ^(.*)$ index.php?q=/%1/$1 [L,QSA]


3. плагин на события OnWebPageInit (для роутинга доменов, отправки на 404 с несуществующих доменов, корректной отдачи главной страницы поддомена) и OnParseDocument (для переписывания ссылок с папок на поддомены на сайте)

switch($modx->event->name){
	case 'OnWebPageInit':{
		if (preg_match('/^(www\.)?(.+)\.[^\.]+\.[^\.]+$/', $_SERVER['SERVER_NAME'], $matches) && $matches[2] != 'www') {
    		$subdomain = $modx->db->escape($matches[2]);
			if ($subdomain && $subdomain != '') {
				$sql = "SELECT `id` FROM " . $modx->getFullTableName('site_content') . " WHERE `alias` = '" . $subdomain . "' AND `parent` = '0' AND `deleted` = '0' AND `published` = '1' LIMIT 0,1";
				$q = $modx->db->query($sql);				
				if ($modx->db->getRecordCount($q) == 0){
					//домена такого нет, отправляем на ошибку
					$modx->sendErrorPage();					
				} else {
					$row = $modx->db->getRow($q);
					if ($_GET['q'] == ''){//если в корне, берем главную этого сайта
						$modx->sendForward($row['id']);
					}
				}
			}
		} else {
			//ничего не делаем, если поддомена нет
		}
		break;
	}

	case 'OnParseDocument':{
		if (preg_match('/^(www\.)?(.+)\.[^\.]+\.[^\.]+$/', $_SERVER['SERVER_NAME'], $matches) && $matches[2] != 'www') {
    		$subdomain = $modx->db->escape($matches[2]);
			if ($subdomain && $subdomain != '') {
				
				//парсим ссылки в нужный вид - убираем из ссылки поддомен
       			$source = $modx->documentOutput;
        		$source = $modx->mergeSettingsContent($source);
        		$source = $modx->mergeDocumentContent($source);
        		$source = $modx->mergeSettingsContent($source);
        		$source = $modx->mergeChunkContent($source);

            	$source = $modx->evalSnippets($source);
            	$source = $modx->mergePlaceholderContent($source);
            	$source = $modx->mergeSettingsContent($source);
		$source = $modx->rewriteUrls($source);
				

		$source = preg_replace('/href="(\/)?'.$subdomain.'/i', 'href="', $source);
				$modx->documentOutput = $source;
			}
		}
		break;
	}
}


4. Сниппет hostRouter для определения корректного хоста (он нам понадобится например для ошибки 404, чтобы давать ссылку на соответствующую главную страницу)

<?php
//возвращает хост вместе с поддоменом, если такой существует на сайте либо главный домен
	//[!hostRouter!]
	//либо id главной страницы поддомена
	//если такой поддомен существует [!hostRouter? &type=`docid`!]
	//используется например на странице 404 для переадресации в правильный корень
$host = 'site-example.com';
$docid = $modx->config['site_start'];
$type = isset($type) ? $type : 'host';
$out = '';

if (preg_match('/^(www\.)?(.+)\.[^\.]+\.[^\.]+$/', $_SERVER['SERVER_NAME'], $matches) && $matches[2] != 'www') {
    $subdomain = $modx->db->escape($matches[2]);
	if ($subdomain && $subdomain != '') {
		$sql = "SELECT `id` FROM " . $modx->getFullTableName('site_content') . " WHERE `alias` = '" . $subdomain . "' AND `parent` = '0' AND `deleted` = '0' AND `published` = '1' LIMIT 0,1";
		$q = $modx->db->query($sql);				
		if ($modx->db->getRecordCount($q) > 0){
			$host = $subdomain.'.'.$host;
			$row = $modx->db->getRow($q);
			$docid = $row['id'];
		}
	}
}

switch($type){
	case 'docid':{
		$out = $docid;
		break;
	}
	default:{
		$out = $host;
		break;
	}
}
return $out;
?>


Вот собственно и все. Теперь каждая папка в корне сайта — это новый минисайт на поддомене, соответсвующий алиасу этого корневого ресурса.


70 комментариев

avatar
Зачет. Просто, Красиво и юзабельно :)
avatar
небольшие правки в файл htaccess

я люблю без правок в htaccess… так как не у всех он есть, да и можно обойтись одним плагином.
Расширение — это установил и пользуешься, а не бегаешь и куча файлов перенастраиваешь (если это позволяет система, в данном случае позволяет)
avatar
Можно конечно плагином REQUEST['q'] пытаться модифицировать, но вероятность, что это будет работать далеко не везде — выше, чем вероятность, что отстутствует htaccess :)
avatar
Ну, дело хозяйское :) Я как лучше хотел, без критики.…
avatar
А если два домена разные получится подружить с одной админкой? Например один раздел чтобы был и на сайте 1 и на сайте 2, только с разным дизайном.
А решение зачет:) Как говорится с минимальными правками.
avatar
Да это тоже возможно
avatar
а смысл? :) красиво и юзабельно… но…
в плане продвижения — не фонтан. Каждый субдомен — фактически новый сайт. Затраты не оправдывают данный способ. Проще уж контейнеры юзать и переливание веса по всем страницам.
avatar
Смысл в том, чтобы решить такую задачу :) Есть задача, надо ее решить (причем в последнее время какая-то мода на эти поддомены пошла, часто встречаться стали)… бывает такое :)
avatar
не спорю, но клиент потом повеситься… когда поймет в какая у него «байда» )
avatar
Бывает так что не нужно продвигать поддомены, или клиента не интересует вообще продвижение. Потому логично уведомить клиента о том какие есть минусы данной реализации и предложить альтернативу. Но если он все равно хочет именно так то уже и делать именно так. И клиент не будет вешаться ибо он сознательно выбрал этот вариант зная о его недостатках
avatar
автору+ :)

вчера обратился человек, который хочет именно такое решение. Все попытки отговорить от субдоменов — увенчались крахом :)
avatar
Если просят поддомены, то речь и идет о том, чтобы разнести контент по разным сайтам. С той же мультиязычностью специально это оговаривается.
А еще есть такая тема, как типа сайты пользователей — сайт компании в справочнике, например.
Так что решение далеко не бессмысленно.
avatar
вот кстати с мультиязычностью от evoBabel вполне себе должно подружиться, т.к. там такой же принцип — язык — новая папка в корне. Так что сделать ее поддоменом вполне себе можно этим решением.
avatar
Делал по-другому, но с этим решением конечно проще и красивее получится.
avatar
Подскажите, где туплю, после установки плагина идет перенаправление на site.ru/sub/stranica вместо sub.site.ru/stranica
avatar
Не совсем понятно откуда и каким образом у вас идет это перенаправление. Смысл всего этого вкратце как-раз в двух вещах:
1. внутренний редирект с sub.site.ru/stranica на site.ru/sub/stranica без внешнего редиректа (т.е. урл остается с поддоменом, но страница берется как будто адрес с папкой sub)
2. переписывание адресов чтобы адреса с поддомена sub.site.ru/sub/stranica приобретали вид sub.site.ru/stranica — т.е. при наличии поддомена из ссылки удаляется папка из начала адреса такая же как поддомен

Ну и естественно — т.к. задачи конкретной в таких сайтах не бывает, вернее их обычно очень много и они очень разные, то и единого решения не существует. Но как минимум надо еще поработать с base href чтобы он возвращал туда текущий поддомен/ Т.к. по умолчанию обычно делается

<base href="[(site_url)]" />
— но site_url возвращает хост без поддомена, поэтому в случае поддоменов я делаю так

<base href="[!getServerName!]" />


и сниппет getServerName

<?php
return 'http://'.$_SERVER['SERVER_NAME'].'/';
?>


В общем как поймете смысл происходящего, так тут же и остальные решения будут найдены :)
avatar
блин не понял ((( надо получить результат, что бы получалось sub.site.ru/stranica а сейчас при переходе по адресу sub.site.ru получаем site.ru/sub
получить:
2. переписывание адресов чтобы адреса с поддомена sub.site.ru/sub/stranica приобретали вид sub.site.ru/stranica — т.е. при наличии поддомена из ссылки удаляется папка из начала адреса такая же как поддомен
Комментарий отредактирован 2014-06-19 09:19:48 пользователем DiTso
avatar
Сложновато отвечать на подобные вопросы не имея никаких исходных данных ни по структуре сайта ни по тому, как где и чем формируются ссылки, ни по тому насколько корректно вы внесли все нужные изменения.
Непонятно почему вы при вводе sub.site.ru должны попасть на sub.site.ru/stranica и не находится и не находится ли у вас в дереве еще чего-нибудь кроме поддоменов.
avatar
Поставил ваш скрипт по городам-поддоменам, вроде всё работает, но вылез глюк такой:

Вот домен
washing.techmann.ru

Это тоже самое, что techmann.ru/washing/

Но если в каталоге, который сделал через ditto перейти по ссылке washing.techmann.ru/equipment-by-types/ultrasonic-baths/, то ничего не открывается.

А если washing.techmann.ru/washing/equipment-by-types/ultrasonic-baths/ то открывается то, что надо.

В шаблоне дитто ссылки указаны через [~[+id+]~]

Как сделать, чтобы нормально работало?
avatar
Поставил ваш скрипт по городам-поддоменам, вроде всё работает, но вылез глюк
Это не глюк, это означает, что у вас НИЧЕГО не работает в области переадресации, т.к. некорректно настроен htaccess. По адресу washing.techmann.ru/equipment-by-types/ultrasonic-baths/ при корректной настройке и должна открываться страница techmann.ru/washing/equipment-by-types/ultrasonic-baths/, а у вас просто 404 ошибка (нет такой страницы) — что означает что редиректа нет или он идет некорректно.
Также при заходе на несуществующий домен вроде адреса gggg.techmann.ru/ у вас должна показываться ошибка, а у вас вообще ничего нет по этому адресу :)

Т.е. ни домены на хостинге, ни htaccess — все настроено неверно и не так, как написано в инструкции. Я думаю, все же целесообразнее вам обратиться в раздел работа, если не удается по инструкции сделать все чтобы работало…
avatar
Ну например coloring.techmann.ru
washing.techmann.ru
открывает главные страницы, всё как надо.

Можете пояснить вот эту строчку в htaccess
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^([a-zA-Z\-]+).site\-techmann\.ru$ [NC]
RewriteRule ^(.*)$ index.php?q=/%1/$1 [L,QSA]


что в третьей строчке должно быть вместо site? сам алиас или также оставаться site?
avatar
Может как-то адрес по другому писаться должен в этой строчке?
avatar
Оказывается нужно было писать вот так
RewriteCond %{HTTP_HOST} ^([a-zA-Z\-]+)\.techmann\.ru$ [NC]
и тогда всё работает как надо! Ну кто же знал, в инструкции всё по другому написано!
avatar
Сомневаюсь что в инструкции я вас заставлял писать вот эту строчку

RewriteCond %{HTTP_HOST} ^([a-zA-Z\-]+).site\-techmann\.ru$ [NC]


когда у вас домен просто techman.ru )))
Или это моя вина, что вы не понимаете записи site\-example\.com, которая означает домен site-example.com с экранированными символами — (дефис) и. (точка) )))
avatar
Никогда не имел дело с поддоменами. Когда понадобилось, хотел использовать это решение, но просто ничего не понял:) Если не трудно, прошу ответить на пару вопросов. Могу ли я с помощью этого решения сделать только одну ссылку ведущую на поддомен с главного сайта? И требуется ли установка на поддомен ещё одной модХ?
avatar
Ну я то из вопроса понял еще меньше- особенно насчет ссылки — никто не мешает вам на сайте поставить произвольное количество ссылок на произвольные адреса как на своем сайте так и за его пределами:)))
Никаких копий на другие домены ставить не нужно, их вообще не длжно быть этих никаких других поддоменов — это один домен и остальное — его алиасы.
avatar
Хм… Вот теперь вообще запутался. т.е. Ваше решение, как бы не управляет поддоменами, а просто меняет урлы, как выглядели бы они если бы были поддомены?
avatar
Я не сильно понимаю что вы имеете в виду под «управляет доменами». Сформулируйте лучше, чего хотите добиться вы или что конкретно не получается из того, что описано. Может быть вы пытаетесь решить совершенно не задачу вида «города-поддомены».
avatar
Есть информационный ресурс.в его меню есть ссылка на интернет магазин, который должен продвигаться как отдельный сайт, для этого он должен располагаться на поддомене.грубо говоря поддомен это папка на сервере (первый пункт инструкции).Т.е. Создать эту папку надо, но туда помещать ничего не надо? Извините за непробиваемую тупость, но я никак не могу понять принципа этого решения.
avatar
Смысл этого решения — в том, чтобы размещать однотипные сайты на разных поддоменах — т.е. есть какой-то схожий каталог услуг в разных городах — вот для каждого города свой поддомен и показывается. А если вы хотите просто другой кусок сайта сделать на другом поддомене — то это не относится к «городам-поддоменам» :)

Можно конечно приспособить это дело, поместив весь остальной сайт в другую папку и сделав его «доменом по умолчанию» — т.е. открывающимся без поддомена. Но в целом данная тема немного не про это.

А принцип этого решения прост до безобразия и состоит из двух частей:

1. строки в htaccess

RewriteCond %{HTTP_HOST} ^([a-zA-Z\-]+).site\-example\.com$ [NC]
RewriteRule ^(.*)$ index.php?q=/%1/$1 [L,QSA]


подменяют запрос вида poddomen.site.ru/page1 на запрос вида site.ru/poddomen/page1 (не забываем тут имя сайта в htaccess site\-example\.com заменить на свой домен). Т.е. в итоге заходя на адрес poddomen.site.ru/page1 мы должны увидеть страницу page1, лежащую в корневой папке poddomen. Автоматически создав еще одну корневую папку, все что в ней также будет «видно» на новом поддомене, соответствующем ее алиасу.

2. и вторая часть — спец плагин переписывает на самой странице все ссылки вида site.ru/poddomen/page1 назад в ссылки вида poddomen.site.ru/page1, чтобы мы не ходили в папке poddomen, а ходили по поддомену.

Вот исходя из этого принципа данной решение нужно (при необходимости) приспосабливать и к вашей задаче.
avatar
Всё теперь предельно ясно. Огромное спасибо.
avatar
Ну и не забывайте про то, о чем я говорил раньше — все поддомены должны быть алиасом основного домена (обычно на хостинге в той же c-panel есть птичка типа «автоматически создавать поддомены» и настройки алиасов для домена site.ru где можно указать псевдоним *.site.ru.
Это нужно именно для того, чтобы создав новую папку в корне, она автоматически работала как новый поддомен. В противном случае адреса то мы на нее перепишем (ссылка вида aliasnew.site.ru у нас появится), вот только такого адреса реально на хостинге не окажется, т.к. он будет отвечать, что такого поддомена у него не существует.
avatar
Отличное решение, но немного туплю каким образом можно его адаптировать под свою структуру:

Основной сайт
--Страница 1
--Страница 2
--Страница 3
--Регионы
----Регион 1
----Регион 2
----Регион 3

Т.е. регионы у меня получаются в подкаталоге, на каждый регион, по одной странице, список вывожу ditto

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

Мне кажется решение где-то на поверхности, может сталкивался кто и поделится?
avatar
Подскажите что я делаю не так, плагин добавил (системные события выбрал)
htaccess изменил
домен
year.xusnut.ru
структура
— year
— Новости
— year2
— Новости

# For full documentation and other suggested options, please see
# svn.modxcms.com/docs/display/MODx096/Friendly+URL+Solutions
# including for unexpected logouts in multi-server/cloud environments
# and especially for the first three commented out rules

#php_flag register_globals Off
AddDefaultCharset utf-8
#php_value date.timezone Europe/Moscow

#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 domain.com -> www.domain.com — used with SEO Strict URLs plugin
#RewriteCond %{HTTP_HOST}.
#RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
#RewriteRule (.*) www.example.com/$1 [R=301,L]

# without www
#RewriteCond %{HTTP_HOST}.
#RewriteCond %{HTTP_HOST} !^example\.com [NC]
#RewriteRule (.*) example.com/$1 [R=301,L]

# without www all domian
#RewriteCond %{HTTP_HOST}.
#RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC]
#RewriteRule ^(.*)$ %1/$1 [R=301,L]

# Exclude /assets and /manager directories and images from rewrite rules
RewriteRule ^(manager|assets|js|css|images|img)/.*$ — [L]
RewriteRule \.(jpg|jpeg|png|gif|ico)$ — [L]

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

# without www all domian — перенаправляем все на «без www»
RewriteCond %{HTTP_HOST}.
RewriteCond %{HTTP_HOST} ^www.(.*)$ [NC]
RewriteRule ^(.*)$ %1/$1 [R=301,L]

#correct robots.txt, можно и для sitemap.xml такое же сделать — чтобы на каждый поддомен отдавался свой файл соответствующего хоста
RewriteCond %{HTTP_HOST} ^([a-zA-Z\-]+)\.xusnut\.ru$ [NC]
RewriteRule ^robots.txt robots-%1.txt [L]

# subdomains to domian — перенаправляем запрос к поддомену на запрос в соответсвующую папку
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{HTTP_HOST} ^([a-zA-Z\-]+)\.xusnut\.ru$ [NC]
RewriteRule ^(.*)$ index.php?q=/%1/$1 [L,QSA]

# Reduce server overhead by enabling output compression if supported.
#php_flag zlib.output_compression On
#php_value zlib.output_compression_level 5
avatar
Ни по сайту ни по его структуре не понял задачу. Могу разве что обратить внимание, что в текущем виде задача решается для поддоменов 2-го уровня, если вы хотите на поддомен year навесить сверху еще один поддомен (3-го уровня) — то тут уже надо править по-другому. И второй нюанс — все поддомены, которые нам нужны либо должны быть созданы и вести в одну и ту же папку (куда установлен modx) либо просто на хостинге задано что все поддомены — это алиасы основного домена вида -*.site.ru, чтобы обработка велась в одной и той же папке. Во втором случае сами поддомены физически создавать вообще не нужно.
avatar
Спасибо разобрался неправильно настроил хостинг
avatar
Добрый день. Подскажите, пожалуйста.

Как сделать так, чтобы по определенным адресам открывался документ из корня проекта, а не из подпапки?
Тоесть мне нужно, чтобы по адресу:
tver.site.ru/search?line=строка+поиска
именно открывался (не переадресовывался) документ с альясом search именно из корня проекта, а не tver/search (не из папки поддомена).
Тоесть вопрос относится к общим документам, которые необязательно плодить в каждой папке поддомена.

Спасибо
avatar
Есть косяк с eForm
После проверки формы на странице, например:
msk.mysite.ru/
Перекидывает на
mysite.ru/msk

Кто-нибудь знает как решить?

P.S. Ajax не прокатывает, форма с аттачем
Комментарий отредактирован 2015-02-03 12:15:59 пользователем mrelk
avatar
Для вариантов с аттачем можно использовать фреймы для вставки формы (чтоб оставаться на той же странице). А вообще непонятно что значит «после проверки перекидывает». В смысле после отправки? Или просто после сабмита? Если вариант 2 — просто поставьте пустой action="", чтобы оставаться на той же странице при любом формировании урла.
avatar
Спасибо, пустой action меня спасет.)
А насчет iframe — это не совсем удобно, приходится для кажого фрейма отдельно выносить стили скрипты и т.п.
Комментарий отредактирован 2015-02-03 13:31:35 пользователем mrelk
avatar
вроде всё сделал. Не могу понять, почему при заходе по адресу sub.site.ru он перекидывает на sub.site.ru/sub/
  • toxo
  • 0
avatar
Прошу помощи пол ночи провозился
Такая вот ошибка
Fatal error: Call to a member function escape() on a non-object in
/core/cache/includes/elements/modplugin/3.include.cache.php on line 5

при заходе на поддомен
город.мойдомен.ru/

в файле 3.include.cache.php на 5 строке такой код
<code><span class="pln">$subdomain </span><span class="pun">=</span><span class="pln"> $modx</span><span class="pun">-></span><span class="pln">db</span><span class="pun">-></span><span class="pln">escape</span><span class="pun">(</span><span class="pln">$matches</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]);</span></code>
суппер ) только щас дошло что у меня MODX Revolution а не EVO
под MODX Revolution не прокатит такая конструкция? Сорри за тупые вопросы знаком с MOD X 2 недели
Комментарий отредактирован 2015-02-15 03:20:34 пользователем vilkin
avatar
нет в REVo такой конструкции как
$modx->db->escape()
— о чем и сообщается.
Для рево в прямом виде не пойдет, доделывать надо.
avatar
Наконецто дошли руки попробовать и поставить столкнулся только с 1м моментом.
Так как сервере по запросу $_SERVER['SERVER_NAME'] всегда отдавал одно и тоже заменил везде на $_SERVER['HTTP_HOST'] и все заработало :)
avatar
Спасибо webber, попробовал все работает, почти…

Сайт получился большой, было необходимо включить опцию «Дружественные URL -> Использовать масив AliasListing только для Папок -> Да» (сборка от Dmi3yy, 1.1b-d7.1), тут начались проблемы — поддомен открывается, папка открывается, страница внутри папки — нет, отдает 404.

На стандартной сборке и на сборке от Dmi3yy с выключенной опцией все работает!!!

Решение подсказал Dmi3yy, плагин «aliasListingSubdomainFix» на событие «OnPageNotFound»:


$path_parts = pathinfo($_GET['q']);
$alias = $modx->db->escape(basename($path_parts["basename"], '.'.$path_parts["extension"]));
$id = $modx->db->getValue( $modx->db->select( 'id', $modx->getFullTableName('site_content'), "deleted=0 and alias='{$alias}'" ) ); 
if ($id > 0) {
	$modx->sendForward($id);
}


Еще не рекомендую использовать чисто числа в алиасах, если совпадает с id другого ресурса начинаются проблемы…
Комментарий отредактирован 2015-04-10 23:17:36 пользователем seomass
avatar
Боюсь, что этот плагин aliasListingSubdomainFix будет работать далеко не всегда, а подходит конкретно для вашего сайта :)
avatar
Возможно, я если честно вообще с трудом понимаю что он делает), но вдруг кто то столкнется с такой же проблемой и ему тоже подойдет данное решение…
avatar
Он берет из адреса alias и по нему пытается найти id страницы в базе. Если нашел одну — ее и показывает. Проблема может возникнуть как минимум в двух случаях:
1. в качестве суффикса у вас используется слэш — теоретически
2. у вас несколько одинаковых алиасов в таблице (у разных родителей это может случиться) — в этом либо ничего не покажет, либо может показать не то. Т.е. проверка родителя (его поиск по aliasListing на основе оставшейся после отсечения $path_parts[«basename»] части — крайне желательна.
avatar
Спасибо за разъяснение. Добавлю еще пунктик…
3. Если используются чисто числа в алиасах, если совпадает с id другого ресурса то начинаются проблемы.
avatar
Попробуйте вот такой вариант

if (isset($_GET['q'])){
    $q = $modx->db->escape($_GET['q']);
    $path = pathinfo($q);
    $alias = $modx->db->escape($path["filename"]);
    if ($alias && !empty($alias)) {
        $parent_url = substr($q, 0, strlen($q)-strlen($path["basename"]));
        $parent_url = rtrim($parent_url, '/');
        $where = " WHERE deleted = 0 AND `alias` = '{$alias}'";
        if (isset($modx->documentListing[$parent_url])) {
            $parent = $modx->documentListing[$parent_url];
            $where .= " AND parent = {$parent}";
        }
        $id = $modx->db->getValue("SELECT id FROM " . $modx->getFullTableName("site_content") . $where . " LIMIT 0,1");
        if ($id && $id > 0) {
            $modx->sendForward($id);
        }
    }	
}
Комментарий отредактирован 2015-04-11 14:21:09 пользователем webber
avatar
Спасибо, я не стал использовать чисто числа, приписку из букв сделал. У меня все вроде работает.
avatar
Если используются чисто числа в алиасах, если совпадает с id другого ресурса то начинаются проблемы.

Я думаю, что скорее частный случай того, что не будет работать если
у вас несколько одинаковых алиасов в таблице (у разных родителей это может случиться)
.
avatar
плагин настроил, всё работает sub.site.ru
но вот мне надо что бы текст ещё менялся на sub.site.ru/page
но, меняется только на главной странице, но не в глубь корня

сделано на странице
[список каталога]
текст-текст

вот надо, что бы в поддоменах менялся текст
Комментарий отредактирован 2015-05-14 23:40:42 пользователем DENVER
avatar
Ничего не понял — какой текст? Вы находитесь на конкретной странице (для разных доменов эти страницы разные — если конечно действительно «настроил и все работает» — т.е. по адресу sub.site.ru/page это будет страница page в корневой папке sub, а по адресу sub2.site.ru/page будет страница page в корневой папке sub2).
Соответственно простой вывод того же [*content*] на разных поддоменах выводит разный текст (если конечно на этих страницах вписан разный текст в поле content).
Комментарий отредактирован 2015-05-15 07:40:21 пользователем webber
avatar
есть сайт site.ru и в нём поддомены city1, city2
сайт заполнен контентом. Подключил плагин и создал ресурс city1. Он теперь отображается на странице city1.site.ru
вот что не понимаю, как сделать так, что бы например на city1.site.ru/about и city1.site.ru/contact можно было сделать разный контент (так же и с city2)
а то пока только получается что контент меняется только на city1.site.ru. А дальше по каталогу (city1.site.ru/...) берётся весь контент из домена site.ru/…
надо как то алиасы специальные прописывать? Или создавать новое дерево ресурсов? (вот только с какими именами)
avatar
Если сделать все правильно, то сайты city1.site.ru и city2.site.ru должны лежать соответственно в корневых папках city1 и city2. Т.е. страница city1.site.ru/about для сайта city1.site.ru находится в дереве «по адресу city1/about» (вложена в корневую папку city1), соответственно страница city2.site.ru/about для сайта city2.site.ru будет лежать в папке city2 (корневой) «по адресу city2/about». Ну а поскольку это две разные страницы (они лежат в разных папках) то и разный контент в них заиметь — не проблема (проблема скорее копировать одинаковый)))

Если же у вас что-то из вышеописанного работает не так, значит до этого что-то сделали неправильно (с установкой).
Комментарий отредактирован 2015-05-15 14:51:43 пользователем webber
avatar
(поставил разрешение на одинаковые алиасы)сделал в корне папки
city1/about
city2/about
если переходить на city1/site.ru/about или city2/site.ru/about
выводит последнюю созданную страницу с алиасом about, т.е. везде одинаковая страница получается
avatar
получилось сделать, работают основные доменные страницы site.ru и city1.site.ru
если открыть страницу site.ru\about — открывается страница about
если открыть cite1.site.ru — то ошибка 404. Т.к. такой страницы нету в корне cite1\about
как сделать, что бы: если нету страницы в корне city1, то берётся страница из домена site. А если создать страницу в cite1, то она будет открываться.
что бы не копировать полностью всё.
avatar
Значит у вас ничего не работает — делайте внимательнее по шагам.
Насчет «если нету страницы в корне city1, то берётся страница из домена site» — такое не предусмотрено, т.к. во-первых — совершенно не понятно что именно должно «браться» и по какому принципу; а во-вторых — поддомены делаются немного для другого, чем для дублирования контента по разным адресам :)
avatar
Добрый день. Есть 2 проблемы. Пока не знаю как решить.
1. Breadcrubs режет ссылку на первую страницу до .html т.е., если у нас сайт — site1.domain.ru, то ссылка на первую страницу в breadcrumbs будет site1.domain.ru/.html
2. Ditto формирует паганацию в виде site1.domain.ru/site1/novosti.html?start=10, хотя, просто ссылки на ресурсы получаются такие как надо. site1.domain.ru/novosti/news1.html
avatar
Сначала хотел сделать правильно а потом решил не заморачиваться


<script>
	$('#breadcrumb .B_firstCrumb .B_crumb').attr('href','/');
	$('.pagination a').each(function(i, obj) {
		$(this).attr( 'href', $(this).attr('href').replace('[!subfr!]','') );
	});
</script>

[!subfr!] - возвращает поддомен с /  <br />
в итоге пару строк js и все готово :)  это проще чем ковырять сниппеты и там править что б был правильный вывод
avatar
Ребят, помогите, плиз, решить задачу.

Есть сайт с каталогом товаров. Урл имеет следующий вид: site.ru/catalog/group/tovar-1/. Необходимо продублировать данный каталог для разных городов, причем города выполнены не как поддомены, а в виде: site.ru/city/, т.е. чтобы каталоги для разных городов имели вид:
— site.ru/city-1/catalog/group/tovar-1/
— site.ru/city-2/catalog/group/tovar-1/
— site.ru/city-3/catalog/group/tovar-1/

Содержание каталога в различных городах не меняется. Единственный момент — для страниц городов, т.е. для site.ru/city-1/, site.ru/city-2/, site.ru/city-3/ и т.д. нужно менять тайтлы и заголовки.

Подскажите, каким образом:
1. Реализовать вывод каталога для разных городов (поддомены не нужны)
2. Менять тайтлы, заголовки для страниц различных городов (я так понимаю тут вопрос решится созданием в дереве сайта ресурсов для городов и там уже буду прописывать все что мне нужно. Вопрос — нужно ли будет дублировать структуру каталога для каждого города?)

Конкретный пример того, что мне нужно: vipceiling.ru/samara/solutions/natyazhnoj-potolok-na-kuhne/
avatar
Приветствую!

Надеюсь тема еще жива, очень нужна помощь. Проделал практически все по инструкции. Все работает за одним небольшим исключением. По порядку

1. Настройка алиасов — к сожалению хостер не поддерживаем алиасы, но можно создавать бесконечное кол-во доменов и привязывать их к папке. Я так и сделал. Создал msk.domen.ru

2. htaccess настроил. Судя по всему, все работает правильно. Добавил robots-msk.txt. По домену msk.domen.ru открывается отдельный роботс.
«subdomains to domain» сначала настроил неправильно и страницы domen.ru/msk/comp1.html сначала не отображались по адресу msk.domen.ru/comp1.html. В итоге исправил — заработало

3. Плагин добавил. Судя по всему работает правильно. Т.к. если я его отключаю, то при попытке зайти на msk.domen.ru я попадаю на domen.ru, а не на domen.ru/msk

4. Сниппет тоже создал, но нет понимания зачем он.

Теперь в проблеме. Я добавляю с странице «Москва» дочерний элемент «Компания №1», жму просмотр и попадаю на страницу domen.ru/msk/comp1.html. Если вручную вбить msk.domen.ru/comp1.html, то работает тоже корректно, но ведь должен работать редирект с основного домена на поддомен? А его нет.

Хотел узнать, какой из этих пунктов отвечает за редирект и в чем может быть проблема? Заранее большое спасибо!
Комментарий отредактирован 2016-08-27 08:44:22 пользователем magi
  • magi
  • 0
avatar
Редиректа не было и нет. Плагин подменяет ссылки на страницах с domen.ru/msk/comp1.html на msk.domen.ru/comp1.html для вашего случая — т.е. на странице будут ссылки на поддомен, а не на подпапку. Но, по-сути, это одна и та же страница и если зайти на страницу domen.ru/msk/comp1.html — то она будет показываться точно также, как и msk.domen.ru/comp1.html. Склейку и редиректы пусть СЕО-шники пишут, если она им так нужна :)
avatar
Аа, понял. Спасибо большое за модуль. Он просто шикарный. Но, если основная копия будет полностью дублировать дочерние, то все это благополучно вылетит из индекса за дубли. Так что это просто необходимо.

Не подскажите в какую сторону здесь рыть? Нужно писать плагин или можно обойтись набором правил в htaccess?
avatar
И еще один момент. Я конечно понимаю, что это уже возможно хотелка, но, думаю, все равно очень нужная штука.

По умолчанию главный каталог сайта не хочется захламлять городами. Их ведь может быть много, а помимо этого могут быть технические страницы. Если сделать общий каталог «города». Убрать галочку «участвует в url» и все города складывать туда, то по-факту мы получим такую же картину domain.ru/msk.html Однако при этим поддомен по адресу msk.domain.ru уже не будет работать. Подскажите пожалуйста. Есть ли решение этой проблемы?
  • magi
  • 0
avatar
Потому что в плагине вот этой строкой
$sql = "SELECT `id` FROM " . $modx->getFullTableName('site_content') . " WHERE `alias` = '" . $subdomain . "' AND `parent` = '0' AND `deleted` = '0' AND `published` = '1' LIMIT 0,1";
                                $q = $modx->db->query($sql);


мы ищем поддомен в корне (parent=0). Попробуйте заменить parent на свой (id папки «города»).
avatar
Спасибо! Идеально
avatar
Решил внести вклад в развитие модуля, т.к. считаю его крайне полезным. Ранее я спрашивал о том, как сделать редирект
Теперь в проблеме. Я добавляю с странице «Москва» дочерний элемент «Компания №1», жму просмотр и попадаю на страницу domen.ru/msk/comp1.html. Если вручную вбить msk.domen.ru/comp1.html, то работает тоже корректно, но ведь должен работать редирект с основного домена на поддомен? А его нет.

Проблему решили самостоятельно в помощью небольшого плагина. Код прилагаю ниже

Название любое
В системных событиях выбираем OnParseDocument и OnWebPageInit

if ( $_SERVER['REQUEST_METHOD'] === 'GET' ) {  } else { return false; }
$id = $modx->documentIdentifier;
if ( $id == 1 ) { return false; } // если главная ничего не делать
$poddomens_name = array('ufa','msk','spb');
$redirect = false; // ставим redirect в false
$domen_name = 'domain'; //домен
$domen_zone = 'ru';        // зона

// $_SERVER['SCRIPT_URI'] = "http://domain.ru" . $_SERVER["REQUEST_URI"]; открыть комментарий, если хостинг не поддерживает  SCRIPT_URI

// 111111111
if ( preg_match('~\.domain\.ru~', $_SERVER['HTTP_HOST']) ) { // уже на поддомене. 
	
	
	if ( preg_match('~(/ufa/|/msk/|/spb/)~i', $_SERVER['SCRIPT_URI'], $matches_1 ) ) {
		$redirect = $_SERVER['SCRIPT_URI'];
		$redirect = str_replace($matches_1[1], '/', $redirect);
	}
	
	if ( $redirect ) {
		//if ( !in_array($matches_1[1], $poddomens_name) ) { return false; }
		header('Location: '.$redirect);exit;
	} else {
		return false;
	}
	
	
	
} else { // не на поддомене
	
	print '<pre>';
	print_r($_SERVER);
	print '</pre>';
	
	if ( preg_match('~'.$domen_name.'\.ru/(.{1,10})/~i', $_SERVER['SCRIPT_URI'], $matches_1) ) {
		//if ( !in_array($matches_1[1], $poddomens_name) ) { return false; }
		$redirect = $_SERVER['SCRIPT_URI'];
		$redirect = str_replace($matches_1[1].'/', '', $redirect);
		$redirect = str_replace($domen_name.'.'.$domen_zone.'/', $matches_1[1].'.'.$domen_name.'.'.$domen_zone.'/', $redirect);
	} elseif ( preg_match('~'.$domen_name.'\.'.$domen_zone.'/(.{1,10}).html~i', $_SERVER['SCRIPT_URI'], $matches_1) ) {
		//if ( !in_array($matches_1[1], $poddomens_name) ) { return false; }
		$redirect = $_SERVER['SCRIPT_URI'];
		$redirect = str_replace($matches_1[1].'.html', '', $redirect);
		$redirect = str_replace($domen_name.'.'.$domen_zone.'/', $matches_1[1].'.'.$domen_name.'.'.$domen_zone.'/', $redirect);
	} else {
		echo 'NO';
	}

	if ( $redirect ) {
		if ( !in_array($matches_1[1], $poddomens_name) ) { return false; }
		header('Location: '.$redirect);exit;
	}
}
// 111111111

if ( 0 ) {
	echo '<pre>';
	var_dump($matches_1);
	echo '</pre>';
	//exit;
}

if ( 0 ) {	
	echo '<pre>';
	var_dump($_SERVER);
	echo '</pre>';
	exit;
}


Вероятно тут все можно оптимизировать, но главное работает)

webber, если сочтешь его полезным, можешь добавить в первый пост.
  • magi
  • 0
avatar
Спасибо за хорошее решение!
  • alya
  • 0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.