Удаление дублей страниц в Joomla 1.5

Ни для кого не секрет, что Joomla 1.5 и 1.6 славятся умением создавать копии страниц. Это обстоятельство оказывает весьма негативное влияние на поисковое продвижение сайта.

В качестве примера возьмем адрес страницы со статьей Joomla 1.5

Одна и та же страница может быть доступна по таким адресам:

site.ru/index.php?option=com_content&view=article&id=22

site.ru/news/tech/l.html

site.ru/news/tech/1-news.html

site.ru/1-news/2-tech/1dsfsdkadfgklhfdgjf

site.ru/home/1.html

и по многим другим. Это не есть хорошо.

Можно, конечно, поставить различные дополнительные компоненты вроде sh404SEF, но опять же. Это дополнительная нагрузка на сервер, а также дополнительная головная боль при обновлениях системы и установке дополнений.

Вариант с правкой robots.txt тоже не всегда является оптимальным так как им можно закрыть дубли вроде site.ru/index.php?option=com_content&view=article&id=22, дубли вроде site.ru/component/content/…, но вот от дублей с измененным псевдонимом (alias), для дублей с индексами разделов, категорий и многих других этот способ не эффективен. Да и закрывать большую часть страниц от индексации не есть хорошо.

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

Описание модуля

Данный модуль предназначен для стандартного компонента com_content со стандартным SEF Joomla 1.5 (на Joomla 1.6 данный модуль не тестировался).

Принцип работы модуля. При генерации страницы со статьей, страницы блога раздела и категории, главной страницы происходит проверка адреса страницы в запросе и адреса страницы в системе. Адрес страницы в системе рассчитывается на основе структуры меню с псевдонимами для разделов и категорий, адреса и смещения (start=10, например) и ссылки на полную версию для статьи.

Если адрес в запросе не совпадает с адресом страницы в системе, то генерируется 301 редирект на адрес страницы в системе. Для каждой страницы он уникален. Как следствие, если движок по самому кривому запросу

смог определить какую страницу загружать, то пользователя или поискового бота автоматически перебросит на нужную страницу. Это значит, что все запросы страниц вроде:

site.ru/index.php?option=com_content&view=article&id=22

site.ru/news/tech/1.html

site.ru/news/tech/1-news.html

site.ru/1-news/2-tech/1dsfsdkadfgklhfdgjf

site.ru/home/1.html

со слешами, без слешей в конце, с индексами, без индексов, с index.php или без него будут автоматически переадресованы 301 редиректом на site.ru/news/tech/1-news.html , например. То есть все дубли поклеятся.

Сам модуль

Перед мной стоял выбор. Добавить данный код в саму систему, в компонент com_content или в код шаблонов. Первые два являются самыми идеологически-верными так как такие задачи должен делать контроллер, а не представление, но вот есть один нюанс. При каждом обновлении движка нужно будет заново вносить правки. Это неудобно. Можно и плагин написать, но мне лень сидеть и дальше копаться в API)

Поэтому было принято решение добавлять код в шаблоны. Да, это грубое нарушение принципов МVС и т.д., но что тут поделаешь.

Для работы модуля нужно внести такие изменения в файлы шаблонов.

Файл /templates/название_вашего_шаблона/html/com_content/frontpage/default.php

Нужно добавить в самом начале файла строки:

<?php defined(‘ JEXEC’) or die(‘Restricted access’);

$this->original_link = «/»;

if (JRequest::getInt(‘start’) > 0) $this->original link .= «index.php?start=» . JRequest::getVar(‘start’);

$this->real link = JRequest::getURI();

if ($this->original link != $this->real link) JApplication::redirect($this->original link);

?>

Файл /templates/название_вашего_шаблона/html/com_content/article /default.php

Нужно добавить в самом начале файла строки:

<?php defined(‘_JEXEC’) or die(‘Restricted access’);

if ($this->article->readmore_link != JRequest::getURI()) JApplication::redirect($this->article->readmore_link);

?>

Файл /templates/название_вашего_шаблона/html/com_content/category/blog.php

Нужно добавить в самом начале файла строки:

<?php defined(‘_JEXEC’) or die(‘Restricted access’);

$this->original_link = JRoute::_(ContentHelperRoute::getCategoryRoute(JRequest::getVar(‘id’),

0));

if (JRequest::getInt(‘start’) > 0) $this->original_link .= «?start=» . JRequest::getVar(‘start’); $this->real_link = JRequest::getURI();

if ($this->original_link != $this->real_link) JApplication::redirect($this->original_link);

?>

Файл /templates/название_вашего_шаблона/html/com_content/section/blog.php

Нужно добавить в самом начале файла строки:

<?php defined(‘_JEXEC’) or die(‘Restricted access’);

$this->original_link = JRoute::_(ContentHelperRoute::getSectionRoute(JRequest::getVar(‘id’))); if (JRequest::getInt(‘start’) > 0) $this->original_link .= «?start=» . JRequest::getVar(‘start’); $this->real_link = JRequest::getURI();

if ($this->original_link != $this->real_link) JApplication::redirect($this->original_link);

?>

Если у вас в папке с шаблоном таких файлов нет, то используйте те же файлы файлы в папке /components/com_content/views/…/tmpl

Аналогичным способом можно избавиться от копий и на других компонентах Joomla.

Автор: Тониевич Андрей (toniyevych@gmail.com)

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

  1. Здравствуйте!
    У меня на сайте дублей страниц аж для одной статьи 80 штук, и все бы ничего но google webmaster на это ругается, если я сделаю редирект для каждой статьи это ж ппц сколько надо убить времени и сил, а что делать в дальнейшем, снова будут плодиться?

  2. Здравствуйте. А подскажите, открываю допустим файл /templates/название_вашего_шаблона/html/com_content/article /default.php и первые строчки у меня вот такие <?php // no direct access
    defined('_JEXEC') or die('Restricted access');…Это тоже самое или надо прописывать что вы пишите?И вообще что это значит?

  3. Спасибо супер! Все заработало, кроме других компонентов Joomla: com_quickfaq; com_xmap; com_contact и т.д. Подскажите как настроить и где что прописать. Спасибо

    • Боюсь к ним он будет работать, Вообще если хотите полностью избавиться от дублей то лучше всего использовать дополнительные компоненты. Я использую лично ARTIO JoomSEF, есть конечно нагрузка на сервер, но если хороший хостинг, лучше конечно виртуальный сервер, то будет все замечательно летать.

      • Спасибо. Не подскажите как с автором можно связаться, кроме почты, может он решение нашел? подскажите или пишите на мое мыло. Буду очень признателен… Мыло: p.s.w.s.p пес mail.ru

  4. отлично, спасибо за терпение)) еще вопрос мучает — когда жму на свой ник в этих комментариях кидает на мой сайт. но почему то он выглядит так http://www.anapa-gorodok.ru/noservice/ и выдает 404. из яндекса тоже так кидало. если вбивать вручную в браузер и из закладки то всё нормально — anapa-gorodok.ru и загружается главная страница.

    • у меня открывается главная, все норм.

      У тебя два сайта www и без него, это плохо. Сделай редирект с одного на другой.

  5. самая последняя строчка походу — «стандартная ссылка» — это наверное алиас? там я пишу тот адрес по которому из поисковиков заходят?

  6. мдя… чувствую себя жирафом)) «Менеджер URL JoomSEF» — это то где я менял урлы. Когда выбираешь «показать все перенаправления» — там есть новые урлы. Когда выбираешь «показать SEF Urls» — абсолютно пусто. я не так переделал? а алиас я чего то вообще не вижу))

    • В «показать все перенаправления» как раз там и ищи нужные тебе урлы по поиску, а в самом урле есть вкладка алиас

  7. Это через Manage 301 Redirects сделать? «переместить из url» — беру из меню joomla адрес «index.php?……» и «переместить в url» — новый адрес sef? правильно понял?

  8. добрый день! установил вчера ARTIO JoomSEF, настроил, переделал все url. Теперь на сайте у меня одни url, которые я правил, а с поисковика, того же гугла, по запросу я попадаю на старый url страницы. Получается если они меня будут индексировать — посчитают это дублями? Наверно нужно чтобы по старому url выдавалась 404 ошибка, чтобы они их из базы удалили? Как это сделать, подскажите пожалуйста.

    • Если с поисковиков у тебя кидает не на новые страницы и не на 404, а после компонента у тебя все урлы новые то это значит: что ты вывел одни и теже страницы с разных мест (с меню, с модулей и т.д.)
      Можно сделать внутренние редиректы через этот компонент на один урл каждого меню, что бы он был со всех выводов один.
      У меня когда поставил компонент, все урлы стали новые и старые с поисковиков выдавали 404, на основные меню я сделал редиректы со старых на новые что бы с поисковиков переходили куда надо, остальные страницы надо чтобы яндекс и гугл пере индексировал, это занимает у них времени до месяца.

  9. Спасибо за подсказку, посмотрю компоненты. После редактирования пропала главная страница. Вместо неё выдает
    Parse error: syntax error, unexpected T_STRING in /home/users2/n/ncuxolupuk/domains/anapa-gorodok.ru/templates/a446/html/com_content/frontpage/default.php on line 5
    Что может быть не так?

    • Допустил где то ошибку, но если в итоге захочешь перейти на sef компоненты то лучше возвращать все назад.

    • У автора пропущены нижнии подчеркивания, поэтому и ругается. В frontpage/(tmpl/)default.php надо вставить это:
      original_link = «/»;
      if (JRequest::getInt(‘start’) > 0) $this->original_link .= «index.php?start=» . JRequest::getVar(‘start’);
      $this->real_link = JRequest::getURI();
      if ($this->original_link != $this->real_link) JApplication::redirect($this->original_link);

      ?>

  10. Добрый день. А как проверить что с дублями теперь всё нормально?:) вчера генерировал sitemap и изучая обнаружил несколько ссылок на одну и ту же страницу. Сегодня вылетел из выдачи яндекса. Видимо из-за этих страниц?

    • По моему опыту, скажу что если хочешь избавиться до конца от дублей старицы в Joomla, то необходимо ставить sef компонент sh404sef или Artio JoomSEF. Иначе не как.

  11. Код, вставленный в article.php вызывает ошибки, хотя и работает нормально, но грузит процессор на хостинге:

    PHP Notice: Undefined property: ContentViewArticle::$_messageQueue in /путь к сайту/libraries/joomla/application/application.php on line 349
    PHP Fatal error: Call to undefined method ContentViewArticle::close() in /путь к сайту/libraries/joomla/application/application.php on line 378

    Не подскажете, как с этим справиться?

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *