Home Contact Sitemap
Заказать качественные web услуги

Блог web-разработчика

Блог о веб-технологиях, скриптовых языках, CMS.

День недели и дата публикации - Суббота, 28 ноября 2009 - 23:02 в категории MODx. Вы можете читать сайт в RSS потоке.

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

Категория 28 ноября 2009 in 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) :


$this->documentIdentifier=
$this->getDocumentIdentifier($this->documentMethod);

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


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')));
 }
}

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

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

При использовании ЧПУ часто забывают создать псевдоним для главной страницы сайта. Таким образом, создаются дубли самой главной страницы. Как их избежать (закрыть в 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 нужно поставить доменное имя сайта.

42 Ответов на “Дублирование контента в MODx”

  1. Сергей сказал:

    А как насчёт слэша на конце адресов?
    Как избежать дублирование страниц с адресами ‘site.ru/doc/’ и ‘site.ru/doc’

  2. mgordeev сказал:

    Дополнил статью. Спасибо за вопрос)

  3. Сергей сказал:

    Есть ещё неплохой скрипт для автоматического редиректа. Редиректит на выбранный алис и с адресов со слэшами и страницы типа index.php?id=… и пр.

    http://modxcms.com/extras/package/395

  4. alex сказал:

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

    Не работает этот метод с SEO Strict плагином.

  5. Alex сказал:

    При вставки кода в document.parser.class.inc.php сайт пересает открываться. Пишет:

    Parse error: syntax error, unexpected ‘[‘ in /home/users/d/dimap/domains/group-ra.ru/manager/includes/document.parser.class.inc.php on line 1085

    Подскажите, что ему не нравится?

  6. mgordeev сказал:

    Вероятнее всего вы скопировали строчки из поста, и если не поменять форматирование, то в нем будут неправильные кавычки.

    http://www.mgordeev.ru/files/topress.php

    правильный кусок кода. Только дескрипторы надо убрать)))

  7. vitaksa сказал:

    Про псевдонимы для главной страницы спасибо!
    А такой вопросик. Происходит дублирование контента Яндексом и гуглом в таких ситуациях:
    http://www.mysite.ru
    mysite.ru
    Как от этого избавится.
    Может вопрос и туповат, но на modx перешел 8 дней назад

  8. mgordeev сказал:

    В .htaccess необходимо добавить строки:

    RewriteCond %{HTTP_HOST} ^yousite\.ru
    RewriteRule .* http://www.yousite.ru.%{REQUEST_URI} [L,R=301]

    подставив вместо yousite адрес Вашего сайта.

  9. levik сказал:

    Strict URLs Вам в помощь.
    на официальном сайте искать тут:
    http://modxcms.com/extras/package/395

  10. levik сказал:

    Чуть не забыл — не забыть добавить Rewrite в .htaccess (по умолчанию закомментирован) — иначе при очистке кэша можно случайно «переехать» с http://www... на «без www» или наоборот. В общем, первый запрошенный документ и сформирует адрес сайта.

  11. Googa сказал:

    Использую MODx 1.0.5
    Вставил код в document.parser.class.inc.php — все вроде ок, вот только теперь главная с псевдонимом отображается http://www.site.ru/index (хотя ссылка идет на http://www.site.ru)
    Как его убрать не подскажете?

  12. mgordeev сказал:

    Попробуйте у главной страницы убрать псевдоним.

  13. Googa сказал:

    я юзаю плагин TransAlias и он автоматом ставит псевдоним, если поле пустое(

  14. mgordeev сказал:

    Да, тогда проблема. Ничего кроме костыля на ум не приходит.
    строку
    if (intval($res[0])>0){
    заменить на
    if ((intval($res[0])>0)&&(intval($res[0]!=$this->getConfig(‘site_start’)))){

  15. Bulava сказал:

    Огромное спасибо, подскажите как перенаправлять с http://www.site.ru на site.ru в стандартном modx .htaccess.
    Нигде не могу найти, если ставить обычный 301 с включеными чпу, то ничего не получаеться.

  16. mgordeev сказал:

    В .htaccess необходимо добавить строки:

    RewriteCond %{HTTP_HOST} ^www\.yousite\.ru
    RewriteRule .* http://yousite.ru%{REQUEST_URI} [L,R=301]

    подставив вместо yousite адрес Вашего сайта.

  17. Максим сказал:

    Приветствую.
    А если используются вложенные урл, то не работает такое исправленьице, или я что-то не понимаю. Например , сайт/catalog/12/ и предположим сайт/catalog/tv/ — одна и таже страница. Это как нибудь можно исправить?

  18. anrey сказал:

    поставил MODx Revolution 2.0.8-pl (advanced) подскажите как там правильно составить robots.txt

  19. andrey сказал:

    такого файла document.parser.class.inc.php. в MODx Revolution 2.0.8-pl (advanced) нет, как там бороться с дублями, кстати еще sitemap тоже не создается по тому как тут описано, жду помощи

  20. daaudit сказал:

    Modx упрямо не хочет в ЧПУ-урлах проставлять точку. Возникла проблема с robots.txt и sitemap.xml В обоих случаях выдает что-то следующее sitemapxml.html и robotstxt.html Если в поле alias написать sitemap.xml и сохранить, то сохраняется как sitemapxml (без точки) Как в .htaccess исправить это?
    С уважением,

  21. mgordeev сказал:

    Может дело в специфичных настройках плагина TransAlias? Попробуйте его отключить.

  22. zeus сказал:

    всем приве
    ребят подскажите плиз есть сайт есть 1 страница http://www.mysite.ru/cars
    а яндекс видит страницу http://www.mysite.ru/5 т.е. у яндекс не правильный урл. страница одна и таже но под разными урлами. причем проблема только с 1 страницей все остальное норм.
    в админке прописан пункт «ссылка» cars

  23. mgordeev сказал:

    так надо прописать псевдоним и теперь уже редирект ставить

  24. zeus сказал:

    а не подскажите как это сделать?
    очень прошу

  25. mgordeev сказал:

    Псевдоним поставить в системе — тут наверное комментировать не нужно.
    Если страница одна можно прописать в .htaccess

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^5$ /cars$1 [L,R=301]

  26. zeus сказал:

    не получается не как
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^5$ /cars$1 [L,R=301]

    пишу так и не чего не получается не перенаправляет он.
    надо с ссылки http://mysite.ru/5
    оправлять на http://mysite.ru/cars
    псевдоним в свойствах странице прописан.
    и страница доступна одна и та же по обоим адресам,

  27. mgordeev сказал:

    Проверял — должно работать.

    Значит либо htaccess вообще не работает или не там пишите.

  28. Anna сказал:

    Подскажите, пожалуйста, как сделать редирект со страниц http://site.ru/page.html на url со слэшем типа http://site.ru/page/?

  29. Анна сказал:

    Добрый день.

    RewriteCond %{HTTP_HOST} ^yousite\.ru
    RewriteRule .* http://www.yousite.ru.%{REQUEST_URI} [L,R=301]
    (скопировала у вас)

    Установила. Теперь у меня адрес в строке выглядит так: http://www.site.ru./obuchenie

    Как убрать точку после .ru

    Пробовала удалить:
    RewriteCond %{HTTP_HOST} ^yousite\.ru
    RewriteRule .* http://www.yousite.ru.%{REQUEST_URI} [L,R=301]

    Не помогает!

  30. mgordeev сказал:

    RewriteCond %{HTTP_HOST} ^yousite\.ru
    RewriteRule .* http://www.yousite.ru%{REQUEST_URI} [L,R=301]

    так правильно. Сейчас в тексте тоже исправлю.

  31. Анна сказал:

    Спасибо! Потом исправила, когда поняла. Но те, которые уже с точкой, они так теперь и открываются с точкой. Как их исправить?

  32. mgordeev сказал:

    Дело в кеше или системы или браузера. Если все очистить — должно быть ок.

  33. Анна сказал:

    Спасибо.

  34. Степан сказал:

    Создав робот.тхт ПС не индексируют страницы которые создаются через пагинатор. http://site.ru/articles?start=5
    Подскажите как быть?

    И еще вопрос, актуален ли код добавляемый в htacess для новых версий evo? А то что то вешает сайт этот код.

  35. mgordeev сказал:

    В robots.txt вместо Disallow: /*?

    Написать

    Disallow: /*?id=

    Так правильнее будет. Странно, а в какой версии проблема. htaccess вряд ли должен убивать систему.

  36. mr. сказал:

    В .htaccess добавил строки для склейки дублей со слешом, но почему то в выдаче досих пор присутствуют дубли некоторых страниц, со «/» на конце и без! Что же делать? Само не приятное что главная в индексе ПС получилась тоже со слешом, а ссылки на нее я ставил без него! :\\ Так же и с некоторыми другими, хотя большинство проиндексированы как мне и надо, без «/», но не все. Как на это можно повлиять?

  37. Вячеслав сказал:

    Добавил строки:

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

    но редирект с sitemap.xml.html на sitemap.xml не происходит.
    Что еще можно придумать?

  38. Neil сказал:

    Товарищи, подскажите, а почему вообще возникает эта проблема?
    Откуда поисковик узнает о неправильных ссылках если на сайте они все будут однотипные?

  39. Сергей сказал:

    Добрый день!
    Подскажите как можно убрать дублирование заголовка страницы (тег title) в самом текстовом наполнении страницы?

  40. mgordeev сказал:

    to Neil вообще может по пользовательскому фактору, например кто-то некорректную, но рабочую ссылку разместит. Такое часто бывает, когда ЧПУ начинают использовать не с самого создания сайта. Ну или какой-нибудь сниппет неправильно сработает.

  41. mgordeev сказал:

    to Сергей: В шаблоне видимо дублируется. Если в шаблоне все ок — значит используется старая система мета-тегов. В новых версиях MODx система по умолчанию отключена.

  42. Neil сказал:

    to mgordeev: Т.е. проблема касается далеко не всех? Может об этом тоже стоит в статье написать?
    А где можно почитать, чем опасна такая ситуация (с дублированием контента)?

Оставить комментарий

Вы можете подписаться на RSS ленту комментариев.