Как убрать дубли страниц в joomla 2.5 – простой способ.

0
Как убрать дубли страниц в joomla 2.5 – простой способ.

Я уже раньше писал, как убрать дубли страниц в joomla 2.5 через 301 редирект в .htaccess. Этот способ оказался далеким от идеала, так как постоянно надо добавлять новые страницы в .htaccess. Если у вас один сайт, вы делаете 1-2 страницы в неделю, то с этим еще как-то можно мириться, но если больше, то лучше сразу отказаться. Когда есть возможность автоматизировать процессы, то по-любому надо это сделать. Вы сэкономите кучу времени, избежите досадных ошибок.

Напомню суть проблемы. Джумла открывает любой url, если в нем есть корректный Id статьи.

Например, ваша статья имеет url: site.ru/category/12-nazvanie-stati.html, если у вас не установлено дополнительных расширений для борьбы с этой проблемой, то у вас без проблем откроются следующие адреса:

site.ru/category/12-nazvanie-sta

site.ru/category/12-vypej-yadu

site.ru/tvoemu-sairu-kapec/12-nazv

и еще бесконечное множество вариантов подобных url. Представляете, какой это подарок для нечестных конкурентов. Остается купить ссылку на не верный url, либо просто сделать переход, и метрика яндекса это зафиксирует. Ну а как поисковики относятся к дублям, вы сами знаете.

Если ставить сторонние плагины для работы с url, то они дают существенную нагрузку на сайт. При посещаемости 100-300 разницы не будет, но при 10 000 это может оказаться еще одной серьезной проблемой.

Я пытался установить “легкий” плагин, но он как-то далеко не во всех случаях срабатывал.

Итак, я решил делать своими силами все тот же 301 редирект, но уже через php в шаблоне. Возможно это и не правильно и лучше выдавать 404 ошибку, но первый вариант мне нравится больше. Думаю, нужные перенаправления можно реализовать и в .htaccess через более сложное регулярное выражение, но php мне ближе.

Итак, я не эксперт в джумле и php, но чуток подумав выдал следующий код:

 

<?php

defined( ‘_JEXEC’ ) or die( ‘Restricted access’ );

if (JRequest::getVar(‘view’)==’article’)

{ $id_mat=JRequest::getInt(‘id’);

$db = JFactory::getDbo();

$query = $db->getQuery(true);

$query

->select(array(‘a.id’, ‘a.alias’, ‘c.path’))

->from(‘#__content AS a’)

->join(‘INNER’, ‘#__menu AS c ON (c.link=CONCAT(«index.php?option=com_content&view=category&layout=blog&id=», a.catid))’)

->where(‘a.id=’.$id_mat.’ AND c.published=1′);

$db->setQuery($query);

$result = $db->loadObjectList();

if ($result)

{ foreach ($result as $zapr)

{$f_url=JURI::base().$zapr->path.’/’.$zapr->id.’-‘.$zapr->alias.’.html’; if ($f_url != JURI::current())

{

header(«HTTP/1.1 301 Moved Permanently»);

header(‘Location: ‘.$f_url);

exit();

}

}

}

}

?>

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

Для категорий прописал отдельную строку:

if (JRequest::getVar(‘view’) == ‘category’ AND strpos($_SERVER[‘REQUEST_URI’],’?’)!==false ) { $CanonicalLink = JURI::current();

Т.е. делаю канонической только первую страницу категории, остальные некононические. Особенно полезно, если есть описание категории.

На этом пожалуй и все. Не ленитесь, оставляйте коменты!

P.S. Если не можете разобраться, то попробуйте плагин jl no doubles

LEAVE A REPLY