Модуль удаления дублей страниц в Joomla 1.5 PDF

Modul._udaleniya_dubley_stranicz_v_Joomla.pdf

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

В качестве примера возьмем адрес страницы со статьей Joomla 1.5. Одна и та же страница может быть доступна по таким адресам:

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/1dsfsdkgjdfgklhfdgjf

site.ru/home/1.html

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

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

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

К счастью, данную проблему встроенного механизма ЧПУ можно решить более простым путем. Нужно чтобы при вводе неправильного URL пользователя или поисковика перебрасывало 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/1dsfsdkgjdfgklhfdgjf

site.ru/home/1.html

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

Сам модуль

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

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

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

Файл /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.

Поделиться в социальных сетях

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


Защитный код
Обновить

Партнеры



Интересно

Программы по функциям