Запрещаем индексирование шаблонов страниц в Джумла

"Все аспекты самостоятельного создания и продвижения сайтов
от практика с многолетним опытом." — блог Рудь Сергея
info@site-on.net
Заметка: активирована адаптивная версия сайта, которая автоматически подстраивается под небольшой размер Вашего браузера и скрывает некоторые детали сайта для удобства чтения. Приятного просмотра!
08.04.2014

Добрый день, уважаемые читатели блога Site on! Помните одну из моих первых статей про альтернативу robots.txt, которая даже заняла второе место на конкурсе Сосновского? Пришло время улучшить тот код! Но прежде чем это сделать, хочу напомнить, что способ, указанный в той статье отлично работал и продолжает работать на абсолютно любом сайте и CMS, а не только в Joomla. Сегодня же будет рассмотрен частный случай, мы доведём прошлый код до идеала, но только в Joomla. Поэтому пользователей всех других CMS прошу меня простить, и продолжать использовать предыдущий вариант, который тоже отлично работает.

Нашим подопытным кроликом как всегда будет связка Joomla 2.5 + VirtueMart 2. Итак, в Joomla есть такая прекрасная вещь как MVC (Model-View-Controller) паттерн программирования, который по-русски расшифровывается как модель – представление (вид) - контроллер. Так вот представления в Joomla согласно этому шаблону хранятся в папке views (виды).

Каждая страница в Джумла отрисовывается согласно своему представлению, каждое из этих представлений как-то называется. Например, представление категории VM так и называется – category, представление корзины – cart, карточки товара – productdetails и тд.

Как узнать название текущего представления? Для этого в удобном для вас месте шаблона, например, в файле /templates/ваш_шаблон/index.php сразу после открывающегося тега body пишем:

<body>
<?php
echo JRequest::getVar('view');
?>

А если напишем вот так:

<?php
echo 'Текущее представление: '.JRequest::getVar('view').', текущий компонент: '.JRequest::getVar('option');
?>

То узнаем ещё и название текущего компонента:

название компонента

Как вы могли догадаться, на скриншоте я нахожусь на главной странице VM.

Ещё один простой способ узнать имя представления, это зайти в папку views интересующего вас компонента и посмотреть названия папок внутри неё. Например, все представления компонента VirtueMart2:

views

Кстати, в системе шаблонов Джумла есть специально зарезервированная папка под названием html (/templates/ваш_шаблон/html/), в которой могут храниться шаблоны представлений (только представлений!), которые разработчик решил изменить со стандартных, на собственные. Это придумано для удобства обновления: стандартные представления перезапишутся, но работать будут всё равно те, что в папке html.

Теперь к самому главному, что нам всё это даёт? Таким образом, мы можем перестраховаться или даже внести ещё большую универсальность в предыдущую статью на эту же тему.

Например конечный вариант того кода:

<?php if(preg_match('#\?|^/search|/notify$|^/cart|askquestion|^/manufacturer|^/user|^/2-uncategorised|^/component/#', $_SERVER['REQUEST_URI'])){ ?>
<meta name="robots" content="noindex, nofollow" />
<?php } ?>

Можно преобразовать вот так:

<head>
<?php
// заносим значения option и view в переменные
$gwOption = JRequest::getVar('option');
$gwView = JRequest::getVar('view');

if (
(!strstr($_SERVER['REQUEST_URI'], '?start=') and strstr($_SERVER['REQUEST_URI'], '?')) or // запрещаем все страницы, где есть знак вопроса, кроме страниц со стандартной пагинацией Джумлы
preg_match('#^/orders|^/search|/notify$|^/cart|^/manufacturer|^/user|^/2-uncategorised|^/component/|askquestion|by,|orderDesc#', $_SERVER['REQUEST_URI']) or // регулярное выражение как в прошлой статье, добавил пару шаблонов
$gwOption==='com_users' or // запретить к индексированию страницы входа и регистрации, а также профайлы пользователей и всё, что с ними связано.
$gwOption==='com_search' or // запретить страницы поиска
($gwOption==='com_virtuemart' and $gwView!=='category' and $gwView!=='productdetails' and $gwView!=='virtuemart') // запретить к индексации всё, что связанно с VM, кроме страниц категорий, карточек товаров и главной страницы VM.
){
echo '<meta name="robots" content="noindex, nofollow" />';
}
?>
…
</head>

Стиль написания кода мне не нравиться, но думаю, вам так понятней будет. Вообще это всё можно было записать в одну строку. Код выше это всего лишь пример, рабочий пример. Но в процессе создания сайта вы можете устанавливать новые компоненты, можете изменять URL страниц и так далее, поэтому так или иначе, код можно и нужно подстраивать под свой сайт. Хотя, как я уже писал, этот вариант тоже принесёт вам большую пользу.

Со временем я могу изменить код в этой статье, например, если кто-то внесёт свои предложения, так что не удивляйтесь, если он измениться, тем более SEO – это беспрерывный процесс и совершенству нет предела.

Стоит отметить, что такие проверки можно использовать для совершенно разных целей, а не только для запрета индексации страниц.

Всем спасибо за внимание. Скажите НЕТ дублям страниц, как это сделал Site on!

С уважением, .
Пожалуйста, оцените эту статью
Средняя оценка: 4.33 из 5 (проголосовало: 12)
Статья оказалась вам полезной? Подпишитесь, чтобы не пропустить новые!

Ваш email:
Вы можете помочь развитию проекта, сделав всего 1 клик:
Спасибо!
Пожалуйста, прокомментируйте, как Вам моя статья?
Имя:
Комментарий:

Если Вы хотите вставить код, пожалуйста, заключайте его в [code][/code]

Подписаться на новые комментарии:

E-mail:


Защита от спама: пожалуйста, напишите слово "сел" справа налево
Ответ:
Подписаться на новые комментарии без комментирования - Email:
Защита от спама: пожалуйста, напишите слово "сел" справа налево
Ответ:

16.05.2014 15:32:45 Николай:
Есть страница
http://сайт.ru/connect.html
и её дубль
http://сайт.ru/connect.html?format=html&Itemid=9&option=com_content&view=article&id=8&month=11&year=2012
Как избавиться от дубля?
16.05.2014 19:12:57 Сергей отвечает:
1) Читатете данную статью, затем статью по ссылке: клик.

2) Составляете PHP выражение, которое удовлетворит все особенности Вашего сайта.

К сожалению, я не могу составить условие, не сделав детальный анализ Вашего сайта.
26.06.2014 10:51:12 Петр отвечает:
Ето конечно хорошо, но мне всё больше хочется делать сайты на сухом html вообще без всяких вставок и тем более без cms типа джублы. Запретить индексацыю можна всего что угодно но надо бороться с самой проблемой возникновения етих страниц! Моим сайтом уже занимались очень много людей, в том числе и к вам обрасчался, но постоянно вылазят новые дубли. Ето война уже.
Например у меня открывается такая страница - http://domofon-vizit.in.ua/ru/videodomofon/m456c.html/askquestion?tmpl=component
Да можно закрыть от индексации вашим мета тегом, но почему она существует вообще?
26.06.2014 11:30:22 Сергей отвечает:
Особенности работы. Программисты изначально делают так, чтобы всё хорошо работало для людей (только для людей, а не для роботов). Многие программисты даже не задумываются о таком понятии как SEO, так как это не их работа.

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


04.01.2015 04:59:37 Константин:
Благодарю за статью. Дополню изменениями для Joomla 3.x.
Для получения значений переменных вместо JRequest (устарел) используем JInput:


$input = JFactory::getApplication()->input;
$gwOption = $input->getString('option');
$gwView = $input->getString('view');

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


04.01.2015 05:16:42 Константин:
Можно несколько расширить информацию о текущем компоненте/представлении:


<?php
// отладочное сообщение в HTML-комментариях
// ВНИМАНИЕ!!! на "боевом" сайте обязательно удалить это сообщение в целях безопасности
// (вручную или автоматически с помощью плагина сжатия HTML-кода. который удаляет HTML-комментарии).

$input = JFactory::getApplication()->input;
$var_option = $input->getString('option');
$var_view = $input->getString('view');
$var_layout = $input->getString('layout');
$var_id = $input->getString('id');
$var_itemid = $input->getString('Itemid');

echo
'<!-- текущий компонент (option): ' . (empty($var_option) ? 'нет' : $var_option). ' -->' . PHP_EOL .
'<!-- текущее представление (view): ' . (empty($var_view) ? 'нет' : $var_view) . ' -->' . PHP_EOL .
'<!-- текущий макет (layout): ' . (empty($var_layout)? 'нет' : $var_layout) . ' -->' . PHP_EOL .
'<!-- текущий ID элемента (id): ' . (empty($var_id) ? 'нет' : $var_id). ' -->' . PHP_EOL .
'<!-- текущий ID пункта меню (Itemid): '. (empty($var_itemid)? 'нет' : $var_itemid) . ' -->' . PHP_EOL;

?>
04.01.2015 12:00:40 Сергей отвечает:
Константин, спасибо за Ваши дополнения.

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


23.05.2016 16:34:44 Дмитрий:
($gwOption==='com_virtuemart' and $gwView!=='category' and $gwView!=='productdetails' and $gwView!=='virtuemart') // запретить к индексации всё, что связанно с VM, кроме страниц категорий, карточек товаров и главной страницы VM.
А вот тут случайно картинки не заблокирует товаров, категори?
23.05.2016 20:28:27 Сергей отвечает:
Нет. Картинки отдаются сервером напрямую, PHP их не обрабатывает.

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


28.09.2016 13:01:05 Сергей:
Доброго времени суток. Вроде делаю все как надо, внимательно прочитав статью. Однако после применения кода сервер возвращает ошибку 500. Пытаюсь запретить страницы от компонента k2 (joomla 3). Интересно, что я не так выполнил?
13.10.2016 19:58:28 Сергей отвечает:
Это может быть все что угодно, нужно смотреть лог ошибок, там написано что конкретно не так.

Это статья тестировалась на Joomla 2.5, возможно в 3.5 что-то изменили.

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

Использую для работы
Мои расширения
Свежие статьи
Рекомендую
Горячо обсуждаемые
Подписка
  • Следовать в twitter:
  • Подписаться по RSS:
  • Подписаться по E-mail:
  • Следить ВКонтакте:
  • Следить на Facebook:
Пользовательское соглашение об условиях использования сайта и Политика конфиденциальности
Перепечатывание или копирование материалов сайта (текста, изображений и другого содержимого) для их публичного или коммерческого использования в сети Интернет, либо в печатных изданиях строго запрещены. При нарушении данного правила, с нашей стороны будут предприняты соответствующие меры, вплоть до судебной жалобы.
© site-on.net
Шрифт: +стандартно-