21.10.2012

Очередной пост Платона мотивировал меня избавиться от дубляжей страниц в часто используемой мной MODx Evolution. В интернете есть несколько решений данной проблемы, но решено было сделать свой, легкий «велосипед».

Начну с цитаты, которая завертела весь этот процесс:

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

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

Дубляж страниц в MODx Evolution

Очень лояльно отношусь к системе в целом, но как и всё она не без изъянов. В системе довольно неплохо (при грамотной настройке) реализованы механизмы дружественных URL или как их еще называют ЧПУ и транслитерации псевдонимов (используются при формировании ЧПУ). Но по каким-то причинам при реализации этих механизмов не было уделено внимание теме «дубликатов страниц» и на выходе мы имеем следующую, не радующую картину.

Если мы используем в системе дружественные URL и у нас присутствуют префиксы и суффиксы страниц (отсутствие оных немного улучшает картину), мы получим следующий набор запросов, которые будут приводить к одной странице:

  • /index.php?id=2
  • /alias
  • /2
  • /prefix-allias-suffix
  • /prefix-allias
  • /allias-suffix
  • /prefix-2-suffix
  • /prefix-2
  • /2-suffix

А добавив «/» к концу всех запросов, кроме первого, мы получим 17 вариантов обращений к одной странице!

Что бы не совсем сгущать краски, справедливости ради, отмечу, что если у Вас нормально настроен robot.txt и sitemap.xml, дубликакты не должны «всплыть» для поисковиков и мои проекты данное утверждение, подтверждают на практике. Но все же это не повод забить на это, тем более, что решение довольно простое.

Решение проблемы

  1. В разделе «Элементы» → «Управление элементами» создаем новый плагин, у себя я его назвал «SEORedirect»;
  2. В настройках плагина во вкладке «Системные события» ставим галочку «OnLoadWebDocument»;
  3. Вставляем ниже представленный код в «Код плагина» и сохраняем.
$id = $modx->documentIdentifier;
$request = $_SERVER['REQUEST_URI'];
$url = $modx->makeUrl($id);
$params = $_GET;
 
if($id!=$modx->getConfig('error_page')&&(!preg_match('/'.preg_quote($url,'/').'/',$request)||preg_match('/'.preg_quote($url,'/').'\/$/',$request))) {
	if(count($params)>1) {
		$url = $url.'?';
		foreach($params as $param => $value) {
			if((!$params['q']&&$param!='id')||($params['q']&&$param!='q')) {
				$url = $url.$param.'='.$value.'&';
			}
		}
		$url = rtrim($url,'&');
	}
	header('HTTP/1.1 301 Moved Permanently');
	header('Location: '.$url);
	exit();
}

Теперь все страницы из примера будут по 301 редиректу перенаправляться на один единственный адрес /prefix-alias-suffix.