Как убрать дубли страниц в Joomla 3 стандартными методами?
Поскольку в Joomla к одной и то же странице можно обратиться по разному адресу это делает множество дублей контента, что негативно сказывается на продвижении сайта в поисковиках.
Мало кто знает что версиях Joomla 3 на этот случай в самой системе джумлы сделали стандартный плагин который умеет определять канонический адрес страницы и выводить на ней мета-тег canonical.
Мета-тег canonical сообщает поисковым роботам какой адрес страницы является предпочтительным, таким образом даже если будут дубли это будет не важно, индексироваться будут только те страницы которые имеют тег rel=”canonical”
Итак в Joomla 3.4.8 этот плагин называется Система – SEF и выглядит он таким образом:
Однако по умолчанию этот плагин остаётся неактивен, и для того чтобы его включить идём в менеджер плагинов, ищем там плагин SEF
Включаем его ставя галочку в его настройках, а также задаём полный адрес своего домена. (Если в будущем вы будете подключать SSL для домена или переезжать на новый домен, то не забудьте изменить адрес в плагине SEF!)
После включения идем на свою страницу и проверяем между тегами HEAD такую строку: <link href=http://my-site.com rel=canonical />
Как добавить тег canonical в старые версии Joomla?
Поскольку не все обновили свои движки, а продолжили использовать старые версии Joomla, то возникает вопрос: как же добавить canonical в Joomla 2?
1. Не используйте ссылку тега base в качестве canonical! Это вредно.
2. Читайте комментарии в коде.
3. При обновлении заменяем весь код который добавили.
Ссылка Canonical для главной страницы.
Открываем файл templates/МОЙ ШАБЛОН/index.php
после// No direct access. defined('_JEXEC') or die;
// ------------ Start Canonical-Mod $document = JFactory::getDocument(); $mainmenu =& JSite::getMenu(); if($mainmenu->getActive() == $mainmenu->getDefault()) : $livesite = substr_replace(JURI::root(), '', -1, 1); $docpagenr = ''; $docstart = JRequest::getInt('start',0); if($docstart>0) : // Если хотим чтобы в канонической ссылке прописывалась постраничная разбивка типа start=10..., то раскомментируем сроку ниже. //$docpagenr = '?start='.$docstart; endif; //$docroute = JRoute::_('index.php?Itemid='.$mainmenu->getDefault()->id); // Если в качестве канонической ссылки хотим использовать системную ссылку Joomla типа http://мойсайт.рф/home.html , то раскомментируем сроку выше, и закомментируем строку ниже. $docroute = '/'; $document->addHeadLink( $livesite . $docroute . $docpagenr, 'canonical', 'rel', '' ); endif; // ------------ End Canonical-Mod
Ссылка Canonical для страниц компонента материалов (com_content)
Открываем файл templates/МОЙ ШАБЛОН/html/com_content/archive/default.php
после// no direct access defined('_JEXEC') or die; JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');
// ------------ Start Canonical-Mod $mainmenu =& JSite::getMenu(); if($mainmenu->getActive()!== $mainmenu->getDefault()) : $app = JFactory::getApplication(); $document = JFactory::getDocument(); $livesite = substr_replace(JURI::root(), '', -1, 1); $docpagenr = ''; $docstart = JRequest::getInt('start',0); if($docstart>0) : // Если хотим чтобы в канонической ссылке прописывалась постраничная разбивка типа start=10..., то раскомментируем сроку ниже. В противном случае будет индексироваться только главная страница архива //$docpagenr = '?start='.$docstart; endif; $docroute = JRoute::_('index.php?Itemid='.$app->getMenu()->getActive()->id); $document->addHeadLink($livesite . $docroute . $docpagenr, 'canonical', 'rel', ''); endif; // ------------ End Canonical-Mod
Открываем файл templates/МОЙ ШАБЛОН/html/com_content/article/default.php
после// no direct access defined('_JEXEC') or die; JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');
// ------------ Start Canonical-Mod $mainmenu =& JSite::getMenu(); if($mainmenu->getActive()!== $mainmenu->getDefault()) : $requrl = trim($_SERVER['REQUEST_URI']); $document = JFactory::getDocument(); $livesite = substr_replace(JURI::root(), '', -1, 1); $docpagenr = ''; $docstart = JRequest::getInt('start',0); if($docstart>0) : // Если хотим чтобы в канонической ссылке прописывалась постраничная разбивка типа start=10..., то раскомментируем сроку ниже. В противном случае будет индексироваться только главная страница материала //$docpagenr = '?start='.$docstart; endif; $docroute = $this->item->readmore_link; // Начало проверки системной ссылки в запросе. (для редиректа 301 или отдачи ошибки 404.) (bool)$valideurl = strpos( $requrl, $docroute ); if ($valideurl === false) : header("HTTP/1.1 301 Moved Permanently"); header("Location: " . $livesite . $docroute); header("Connection: close"); exit(); // Если хотим отдать ошибку 404, то закомментируем 4 строки выше этой, и раскомментируем 1 сроку ниже. //JError::raiseError(404, JText::_('PAGE COULD NOT BE FOUND')); endif; // Конец проверки системной ссылки в запросе. $document->addHeadLink($livesite . $docroute . $docpagenr, 'canonical', 'rel', ''); endif; // ------------ End Canonical-Mod
Открываем файл templates/МОЙ ШАБЛОН/html/com_content/categories/default.php
после// no direct access defined('_JEXEC') or die; JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');
// ------------ Start Canonical-Mod $mainmenu =& JSite::getMenu(); if($mainmenu->getActive()!== $mainmenu->getDefault()) : $document = JFactory::getDocument(); $livesite = substr_replace(JURI::root(), '', -1, 1); $docpagenr = ''; $docstart = JRequest::getInt('start',0); if($docstart>0) : // Если хотим чтобы в канонической ссылке прописывалась постраничная разбивка типа start=10..., то раскомментируем сроку ниже. В противном случае будет индексироваться только главная страница категории //$docpagenr = '?start='.$docstart; endif; $docroute = JRoute::_(ContentHelperRoute::getCategoryRoute($this->parent->id)); $document->addHeadLink($livesite . $docroute . $docpagenr, 'canonical', 'rel', ''); endif; // ------------ End Canonical-Mod
Открываем файл templates/МОЙ ШАБЛОН/html/com_content/category/blog.php
после// no direct access defined('_JEXEC') or die; JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');
// ------------ Start Canonical-Mod $mainmenu =& JSite::getMenu(); if($mainmenu->getActive()!== $mainmenu->getDefault()) : $document = JFactory::getDocument(); $livesite = substr_replace(JURI::root(), '', -1, 1); $docpagenr = ''; $docstart = JRequest::getInt('start',0); if($docstart>0) : // Если хотим чтобы в канонической ссылке прописывалась постраничная разбивка типа start=10..., то раскомментируем сроку ниже. В противном случае будет индексироваться только главная страница категории //$docpagenr = '?start='.$docstart; endif; $docroute = JRoute::_(ContentHelperRoute::getCategoryRoute($this->category->id)); $document->addHeadLink($livesite . $docroute . $docpagenr, 'canonical', 'rel', ''); endif; // ------------ End Canonical-Mod
Открываем файл templates/МОЙ ШАБЛОН/html/com_content/category/default.php
после// no direct access defined('_JEXEC') or die; JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');
// ------------ Start Canonical-Mod $mainmenu =& JSite::getMenu(); if($mainmenu->getActive()!== $mainmenu->getDefault()) : $document = JFactory::getDocument(); $livesite = substr_replace(JURI::root(), '', -1, 1); $docpagenr = ''; $docstart = JRequest::getInt('start',0); if($docstart>0) : // Если хотим чтобы в канонической ссылке прописывалась постраничная разбивка типа start=10..., то раскомментируем сроку ниже. В противном случае будет индексироваться только главная страница категории //$docpagenr = '?start='.$docstart; endif; $docroute = JRoute::_(ContentHelperRoute::getCategoryRoute($this->category->id)); $document->addHeadLink($livesite . $docroute . $docpagenr, 'canonical', 'rel', ''); endif; // ------------ End Canonical-Mod
Открываем файл templates/МОЙ ШАБЛОН/html/com_content/featured/default.php
после// no direct access defined('_JEXEC') or die; JHtml::addIncludePath(JPATH_COMPONENT . '/helpers');
// ------------ Start Canonical-Mod $mainmenu =& JSite::getMenu(); if($mainmenu->getActive()!== $mainmenu->getDefault()) : $app = JFactory::getApplication(); $document = JFactory::getDocument(); $livesite = substr_replace(JURI::root(), '', -1, 1); $docpagenr = ''; $docstart = JRequest::getInt('start',0); if($docstart>0) : // Если хотим чтобы в канонической ссылке прописывалась постраничная разбивка типа start=10..., то раскомментируем сроку ниже. В противном случае будет индексироваться только главная страница архива //$docpagenr = '?start='.$docstart; endif; $docroute = JRoute::_('index.php?Itemid='.$app->getMenu()->getActive()->id); $document->addHeadLink($livesite . $docroute . $docpagenr, 'canonical', 'rel', ''); endif; // ------------ End Canonical-Mod
Необязательный шаг. Чисто для указания запрета индексации формы добавления/редактирования материала.
Открываем файл templates/МОЙ ШАБЛОН/html/com_content/form/edit.php
// Create shortcut to parameters. $params = $this->state->get('params');
$document = & JFactory::getDocument(); $document->setMetadata('robots', 'noindex, nofollow');
Как дополнение желательно делать запрет на индексацию страниц с параметрами ?limitstart и ?limit добавив их в файл robots.txt
Код
Disallow: *?limitstart Disallow: *?limit
Для тех у кого нет файлов-шаблонов в templates/МОЙ ШАБЛОН/html/com_content/ и они не знают где их взять
копируем components/com_content/views/archive/tmpl/default.php в templates/МОЙ ШАБЛОН/html/com_content/archive/default.php копируем components/com_content/views/article/tmpl/default.php в templates/МОЙ ШАБЛОН/html/com_content/article/default.php копируем components/com_content/views/categories/tmpl/default.php в templates/МОЙ ШАБЛОН/html/com_content/categories/default.php копируем components/com_content/views/category/tmpl/blog.php в templates/МОЙ ШАБЛОН/html/com_content/category/blog.php копируем components/com_content/views/category/tmpl/default.php в templates/МОЙ ШАБЛОН/html/com_content/category/default.php копируем components/com_content/views/featured/tmpl/default.php в templates/МОЙ ШАБЛОН/html/com_content/featured/default.php копируем components/com_content/views/form/tmpl/edit.php в templates/МОЙ ШАБЛОН/html/com_content/form/edit.php