Дублирование контента в MODx

В MODx несмотря на очевидную SEO-ориентированность существует проблема дублирования контента при использовании ЧПУ (человеко-понятные адреса страниц).

Предположим, что существует страница с идентификатором 26 и псевдонимом alias в корне сайта.
Статус 200 Ok будут отдавать следующие страницы с ОДИНАКОВЫМ контентом


1) http://www.site.ru/26.html
2) http://www.site.ru/26
3) http://www.site.ru/alias.html
4) http://www.site.ru/index.php?id=26

Эта ситуация неприемлема с точки зрения поисковой оптимизации. Решение этой проблемы видится в грамотно составленном файле robots.txt и некоторых изменениях в коде файла document.parser.class.inc.php.

Предлагаемый файл robots.txt подходит для всех проектов на MODx с использованием ЧПУ:

User-agent: *
Disallow: /assets/cache/
Disallow: /assets/docs/
Disallow: /assets/export/
Disallow: /assets/import/
Disallow: /assets/modules/
Disallow: /assets/plugins/
Disallow: /assets/snippets/
Disallow: /install/
Disallow: /manager/
Disallow: /?
Disallow: /*?id=
Host: yoursite.ru

Составленный таким образом файл robots.txt не позволит поисковому роботу проиндексировать дублирующиеся страницы 4-ого типа. Повторю, его можно использовать ТОЛЬКО для сайтов на ЧПУ. Для исключения остальных дублей надо немного исправить document.parser.class.inc.php. Этот файл содержит класс API и находится в /manager/includes/document.parser.class.inc.php.

После строки (примерно 1077) :

[sourcecode lang="php"]
$this->documentIdentifier= 
$this->getDocumentIdentifier($this->documentMethod);
[/sourcecode]

надо внести код :

[sourcecode lang="php"]
preg_match('/[0-9]*/', $this->documentIdentifier, $res);
asort($res);
if (intval($res[0])>0){
 if (!preg_match('/\/[0-9]{1,}/', ($this->makeUrl($res[0], '', '', 'full')))){
  header ('HTTP/1.1 301 Moved Permanently');
  header("Location: ".($this->makeUrl($res[0], '', '', 'full')));
 }
}
[/sourcecode]

Этот код будет производить перенаправление с цифровых адресов на адреса-псевдонимы, если они есть.

Самая популярная ошибка:

При использовании ЧПУ часто забывают создать псевдоним для главной страницы сайта. Таким образом, создаются дубли самой главной страницы. Как их избежать (закрыть в robots или сделать редирект) — необходимо решать индивидуально для каждого сайта, общего решения пожалуй что нет.

Также существует дублирование контента из-за добавления слешей в конец адреса. В Modx эту проблему можно решить, настроив особым образом .htaccess.

Если на сайте используются суффиксы для URL (по умолчанию .html), в .htaccess надо добавить строки:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.html[/]+$ $1.html [L,R=301]

В коде .html надо заменить на тот суффикс, который используется на сайте.

Если суффикс для сайта пустой, то необходимо привести все урлы «site.ru/doc/» к типу «site.ru/doc». Это делается в .htaccess:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)[/]+$ $1 [L,R=301]

Но, на мой взгляд, лучше установить суффикс «/» и привести все урлы «site.ru/doc» к типу «site.ru/doc/»:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^.+[^/]$ http://www.site.ru%{REQUEST_URI}/ [L,R=301]

Для того, чтобы исключить дублирование карт сайта, т.е. поставить редирект с sitemap.xml.html на sitemap.xml в .htaccess, надо добавить строки:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)\.xml\.html$ $1.xml [L,R=301]

Вместо site.ru нужно поставить доменное имя сайта.