Исправление ошибки канонических ссылок (link rel="canonical") в joomla 3.х.
Опубликовано: 16 Июль 2013
В joomla ветки 3.x разработчиками была допущена одна досадная ошибка, которая попортила жизнь многим владельцам сайтов и заставила потерять драгоценное время. Ошибка связана с тем, как генерируется атрибут <link rel=”canonical” …>, а именно: при отображении материала в качестве канонического url указывалась категория статьи, но не адрес самого материала. Из-за этого все материалы, которые владельцы сайтов, блоггеры, публиковали на своих сайтах были исключены поисковыми системами из поискового индекса, так как в качестве канонического url указывался адрес не самой статьи, а ее категории. Ошибка очень досадная, и даже кажется странной для команды профессиональных разработчиков, успешно разрабатывающих систему уже почти 10 лет – но, нужно как-то продолжать жить и исправлять эту ошибку.
На форумах можно встретить достаточно много комментариев с предложениями решения этой проблемы, но большинство из них носят «маскировочный» характер, без попытки затронуть сам ее источник. К тому же, большинство решений предлагаемых на форумах - «авторские», они весьма интересны с точки зрения сообразительности и инженерной мысли, но, все же, несут в себе некоторые недостатки и ограничения, связанные с неполным пониманием принципов работы всей системы CMS Joomla. Хотя, я не могу сказать, что предлагаемые решения плохи, они в достаточной мере эффективны и ими вполне можно пользоваться.
Однако, в этой статье я хочу предложить «не городить огород», а воспользоваться тем, что предложили сами разработчики joomla в качестве ответа в своем багтрекере (ссылка). Так как гневных сообщений было много, был выпущен патч, который необходимо внедрить самостоятельно своими руками. Он почти полностью снимает проблему, за исключением одной мелочи, которую мы тоже поправим своими руками. После этого проблема с каноническими url в joomla 3.x отпадает полностью. И можно наслаждаться жизнью.
Почему не надо удалять или блокировать вывод rel=”canonical” в шаблоне?
Среди прочих решений, предлагаемых на большинстве сайтов или форумов, особняком стоит решение, суть которого заключается в удалении, блокировки или вырезании вывода тега «link» с атрибутом rel=”canonical”. Это решение действительно очень надежно и полностью снимает проблему с исключением каких-либо страниц сайта из поискового индекса поисковых систем.
Однако, это решение дает «зеленый свет» другой проблеме, присущей всем CMS без исключения – это дубли страниц в поисковом индексе. Поисковые системы уже давно «привыкли», к тому что сайты работающие на базе какой-либо CMS имеют дублирующие адреса, по которым открывается один и тот же контент. И поэтому они в разумных пределах допускают, что такое возможно и не накладывают санкций. Однако, все же Google впервые предложил, а затем и Яндекс поддержал решение, которое позволяет несколько взять под контроль ситуацию с дублями страниц, и этим решением как раз является указание канонического адреса страницы. Канонического, то есть «правильного» по мнению администратора сайта. В результате, если материал открывается по разным адресам, в поисковый индекс попадает именно тот адрес, который для данного материала указан как канонический. Что весьма удобно.
Поэтому удаление тега «link» с атрибутом rel=”canonical” – не является оптимальным решением. Тем более в ситуации, когда есть возможность исправить ошибку без удаления или блокировки вывода этого тега в шапке html-разметки страниц Вашего сайта.
Решение.
В общем-то решение достаточно простое и оно подробно описано в багтрекере, но не всем может быть понятен английский, к тому же не всем может быть понятен «синтаксис» описания исправлений, которое имеется в выпущенном патче. Поэтому здесь я постараюсь все изложить «по-русски».
Для начала необходимо перейти к файлу:
/libraries/joomla/uri/uri.php
И найти в нем строку 202:
return self::$instances[$uri];
и заменить ее на:
return clone self::$instances[$uri];
Файл сохранить и закрыть. Далее перейти к следующей правке, а именно открыть файл:
/plugins/system/sef/sef.php
И сначала сразу после 34 строки (закрывающая фигурная скобка):
$app = JFactory::getApplication(); $doc = JFactory::getDocument(); if ($app->getName() != 'site' || $doc->getType() !== 'html') { return true; }
добавить:
$router = $app->getRouter();
Далее, необходимо полностью удалить строку 39:
$current = JUri::current();
Затем, вместо строк 46-49:
$link = 'index.php' . $uri->toString(array('query', 'fragment')); $link = $domain . JRoute::_($link); if ($current !== $link)
записать:
$parsed = $router->parse($uri); $fakelink = 'index.php?' . http_build_query($parsed); $link = $domain . JRoute::_($fakelink, false); if ($uri !== $link)
И наконец последняя правка, которую необходимо выполнить согласно выпущенному патчу. В этом же файле вместо строки 51:
$doc->addHeadLink($link, 'canonical');
записать:
$doc->addHeadLink(htmlspecialchars($link), 'canonical');
На этом вроде бы все, больше ничего исправлять не нужно. Действительно, если проверить исходный код всех страниц сайта, особенно страниц с опубликованными материалами – то везде каноническая ссылка указана правильно.
Дополнение.
Однако, если ограничиться только этими правками, то может возникнуть проблема с каноническим url главной страницы сайта, если она оформлена как блог материалов на главной странице. А именно, к основному адресу Вашего сайта дописывается:
?view=featured
И это может выглядеть примерно так:
<link href="http://www.vash-site.ru/?view=featured" rel="canonical" />
В результате, именно такой адрес становится каноническим, при индексации главной страницы Вашего сайта, что тоже как-то не красиво. Это можно легко исправить, если немного модифицировать строку 51, которую мы уже меняли выше. Вместо нее, нужно написать:
$doc->addHeadLink(htmlspecialchars(str_replace("?view=featured","",$link)), 'canonical');
То есть, здесь я предлагаю просто насильно вырезать «?view=featured» из текста канонической ссылки главной, и заменить его на пустую подстроку «». И это работает. Теперь в разделе «head» html разметки главной страницы Вашего сайта, должна быть указана каноническая ссылка главной страницы вида:
<link href="http://www.vash-site.ru/" rel="canonical" />
И это именно то, что нам и нужно!
Если информация этой статьи будет интересна и полезна Вашему кругу друзей и знакомых, то Вы можете опубликовать ссылку - тогда им проще будет ее найти. Они Вам будут благодарны:).