Здравствуйте, уважаемые читатели блога Site on! Сегодня речь пойдёт о такой наболевшей теме, как правильное избежание дублей страниц в наших любимых CMS. Метод, описанный ниже, подойдёт для абсолютно любой CMS, используете ли Вы Joomla, Wordpress или что-то другое. Однако в этой статье для большей наглядности будут приведены примеры из актуальной на данный момент связки Joomla 2.5.9 + VirtueMart 2.0.20, но ещё раз повторюсь, абсолютно без разницы какой CMS Вы пользуетесь!
Всем людям, заботящимся о SEO своих сайтов известна данная проблема не понаслышке, приходится отыскивать и закрывать все технические ссылки (например, ссылка на корзину в интернет-магазинах) с помощью атрибута rel="nofollow", и затем, конечно же, прописывать запреты в robots.txt. Всё это отлично работает для Яндекса, но вот для Гугл robots.txt носит лишь рекомендательный характер. Запрещённые разделы всё равно могут попасть в индекс Гугл, а тем более, если на эти разделы вдруг нашлись dofollow ссылки. О том, как нужно проводить внутреннюю поисковую оптимизацию сайта вы можете прочесть, перейдя по ссылке.
Да, Гугл не индексирует содержимое такой страницы, не зря же мы его запретили в robots.txt, НО само наличие такой страницы (с title в виде адреса страницы) он успешно добавит в свой «сопливый» индекс (Supplemetal Index), что тоже не есть хорошо. (Если вы до сих пор не знаете что такое title страницы, предлагаю прочесть статью об основах HTML и о том, как создать веб-страницу за пару минут.) Дальше нам остаётся лишь заделывать все дыры, удалять все нежелательные ссылки вручную из кабинета Вебмастеров и надеяться, что Гугл не найдёт сотню другую новых дублей.
Как же на 100% защитить себя от подобной возни и перспективы проседания в поисковой выдачи? Как сделать так, чтобы и Гугл и Яндекс не индексировали страницу невзирая ни на что, даже на прямые входящие ссылки? Решение этому известно уже давно и его предлагают нам сами поисковые системы. Всё, что нужно, это прописывать в «голове» страниц, которые мы хотим запретить к индексированию, мета-тег robots со значением content="noindex, nofollow" или content="none", вот так:
<meta name="robots" content="noindex, nofollow"/>
Лично я использую значение атрибута content как в примере выше.
Гугл говорит:
«При наличии на странице метатега noindex Google полностью исключает эту страницу из результатов поиска, даже если на нее ссылаются другие страницы.»
А также:
«Чтобы полностью исключить вероятность появления контента страницы в индексе Google, даже если на нее ссылаются другие сайты, используйте метатег noindex»
Хорошо, с этим всё ясно, да вот только вручную прописывать этот мета-тег, мягко говоря, не с руки, если это вообще возможно и предусмотрено структурой вашей CMS. И если в VirtueMart 2 это предусмотрено:
То это так или иначе ничего не меняет, ведь страницы категорий и самих товаров нам как раз таки нужны, а вот тот же товар /sharik-detail, но со ссылкой /sharik-detail?showall=1 - уже нет.
Нам нужно что-то такое же удобное, как и сам robots.txt, в котором я, к примеру, всегда указываю для своих сайтов на Joomla следующую запись:
Disallow: /*? Disallow: /*&
Которая и была призвана решить проблему дублей, а также, к примеру:
Disallow: /*notify$ Disallow: /*askquestion
Что закроет от индексации в Virtuemart 2 страницы подписки на «появление товара в наличии» и страницу с формой «задайте вопрос о товаре». Другими словами мы попросту используем регулярные выражения, которые благодаря паре строк должны решать все наши проблемы с дублями. Было бы неплохо, чтобы мета-тег robots сам появлялся на тех страницах, которые мы запрещаем в robots.txt, недаром же они имеют одинаковое название :)
Это и натолкнуло меня на мысли, благодаря которым я и придумал решение данной проблемы. Теперь я использую данный метод на всех своих проектах, а сегодня хочу поделиться им и с вами, дорогие читатели блога Site on! Так что попрошу не судить меня строго, если вы не посчитаете мой способ достойным для ваших ресурсов - моя цель поделиться с вами информацией, а на Нобелевскую премию я не претендую ;)
Всё, что нам потребуется - это использование регулярных выражений PHP. Всего благодаря одной функции и в итоге буквально двух строчек PHP кода мы чётко обозначим свою позицию для поисковиков, касательно наших дублирующих страниц. Итак, приступим, рассмотрев следующий пример:
<?php if(preg_match('#\?|&|%|/notify$|^/cart#', $_SERVER['REQUEST_URI'])){ ?>
<meta name="robots" content="noindex, nofollow" />
<?php } ?>
Это и есть те пару строчек, которые я надеюсь, принесут вашим сайтам большую пользу. Здесь мы используем условный оператор if и функцию preg_match(), которая выполняет проверку на соответствие регулярному выражению. Ниже я представил ссылку на страницу официального сайта PHP, где на русском языке(!) приводится описание данной функции и её применение http://www.php.net/manual/ru/function.preg-match.php
А мы же пойдём дальше. Если Вы на сайте используете ЧПУ (SEF) ссылки, то обычно рекомендуют прописывать в robots.txt следующие директивы:
Disallow: /*? Disallow: /*& Disallow: /*%
Это делается, чтобы избежать попадания в индекс технических страниц: страниц сортировки по производителю, страниц фильтрации товаров, поиска и так далее. Наша задача состоит в том, чтобы найдя такие ссылки, PHP скрипт сам нарисовал нужный нам мета-тег.
Предупреждение:
Использовать и robots.txt и мета-тег robots одновременно нельзя, так как поисковики не увидят ваш мета-тег из-за запрета этой же страницы в robots.txt
Поэтому для исключения дублей используйте только PHP-скрипт, а robots.txt оставьте таким, каким он был по умолчанию после установки вашей CMS. И ещё раз для тех, кто не понял или засомневался: вы должны удалить из robots.txt все ваши записи и поместить их в ваше регулярное выражение (между решётками):
preg_match('##', $_SERVER['REQUEST_URI'])
А чтобы узнать, как правильно это сделать, читайте дальше. Продолжаем:
preg_match('#\?|&|%#', $_SERVER['REQUEST_URI'])
Где в одинарные кавычки, через запятую заключают параметры функции (у нас их два: регулярное выражение и переменная с url, но по синтаксису переменную не нужно заключать в кавычки);
# - обозначает начало и конец регулярного выражения;
\ - это экранирование спецсимволов (метасимволов);
| - начало следующего условия.
Далее, через запятую, указываем, в какой строке мы хотим найти данные регулярные выражения, и в нашем случае это $_SERVER['REQUEST_URI'] – глобальная переменная PHP, в которой всегда хранится текущий адрес страницы, он начинается со слеша и не содержит имени домена, например, /index.html?sort=DESC
Вот и всё, теперь, если в нашем url будет содержаться любой из заданных нами символов, мы сразу же запретим его к индексации. Но на этом магия регулярных выражений не заканчивается. Допустим, мы хотим, чтобы у нас не индексировались страницы корзины. Для этого в связке Joomla 2.5 + VirtueMart 2 нужно запретить к индексированию все url, которые начинаются со слова /cart (корзина). Для этого пишем следующее регулярное выражение:
preg_match('#^/cart#', $_SERVER['REQUEST_URI'])
Где ^/cart –это наше регулярное выражение, ^ - говорит о том, что перед нашим условием не может быть ни одного символа, другими словами – знаменует начало строки.
Бывают случаи, когда нам нужно закрыть от индексации страницу с подпиской о появлении товара в наличии. В VirtueMart 2 адрес таких страниц могут начинаться как угодно и при этом они не содержат знак ?, % либо же &, в таком случае нам нужно найти другую лазейку, например то, что адреса страниц с подпиской о появлении товара в наличии всегда заканчиваются на /notify. А значит, составить правильное регулярное выражение, которое случайно не сможет нам навредит, будет проще простого:
preg_match('#/notify$#', $_SERVER['REQUEST_URI'])
Здесь всё аналогично, за исключением того, что мы не будем ограничивать начало строки символом ^, ведь в этот раз нам наоборот, нужен её конец. Для этого в конце мы ставим спецсимвол $, который говорит о том, что это обязательно должен быть конец строки, а если нет, то нам не нужно запрещать её к индексированию. Обращаю внимание, что если дописать в конце адреса страницы безобидный слеш, например, http://domen.com/tovar-detail/notify/ - то визуально для посетителя ничего не измениться, однако такая страница будет открыта для индексации, так как мы указали, что после /notify не должно быть ни одного символа! Этот пример притянут за уши, так как VirtueMart 2 всегда генерирует эту страницу без / на конце, но если Вы хотите себя обезопасить, то используйте следующую комбинацию:
preg_match('#/notify/?$#', $_SERVER['REQUEST_URI'])
/? – знак вопроса здесь обозначает, что слеш в конце может быть, а может и не быть (поэтому он и под вопросом). Если сказать то же самое более «по-научному», то количество слешей может равняться 0 или 1.
Размещать данный код необходимо сразу после открывающегося тега head, то есть в самом начале «головы» вашего сайта:
На скриншоте выше вместо # я по привычке использовал / (оба варианта одинаково верны). Но вам я рекомендую использовать # как я и писал до этого.
Далее я хотел бы рассмотреть уже частный случай размещения моего кода, чтобы с этой задачей мог справиться абсолютно любой читатель блога Site on! Под частным случаем я подразумеваю пошаговый и наглядный пример, как с помощью моего кода можно избавиться от дублей страниц в Joomla. Если Вы используете другие CMS, то вам эта информация всё равно будет полезной!
Шаг 1. Составляем интересующие нас регулярные выражения, однако это не значит, что нужно записывать в них ВЕСЬ robots.txt Что не нужно записывать в регулярное выражение? В регулярное выражение не нужно записывать стандартный перечень директив для сайта на Joomla (с другими CMS аналогично). А именно, стандартный robots.txt выглядит у нас так:
User-agent: * Disallow: /administrator/ Disallow: /cache/ Disallow: /cli/ Disallow: /components/ Disallow: /images/ Disallow: /includes/ Disallow: /installation/ Disallow: /language/ Disallow: /libraries/ Disallow: /logs/ Disallow: /media/ Disallow: /modules/ Disallow: /plugins/ Disallow: /templates/ Disallow: /tmp/
Все эти директивы мы здесь и оставим, так как с этой частью robots.txt у нас и так проблем не наблюдается. Что ещё не нужно записывать в регулярные выражения? На самом то деле запрет & (амперсанда) в большинстве случаев является бессмысленным, так как он используется в url только вместе с ? (знаком вопроса), а значит в наши регулярные выражения достаточно указать только вопросительный знак! (естественно, в robots.txt также не должно быть & среди запрещённых)
Шаг 2. Находим в корне Joomla папку templates, дальше заходим в папку с вашим шаблоном и находим в корне этой папке файл index.php
Шаг3. Открываем index.php и сразу после открывающегося тега head, перед выводом основной части «головы» в Joomla <jdoc:include type="head" /> - вставляем наш код:
Шаг 4. Обязательно тестируем! Проверяем сначала на страницах, где этого мета-тег быть не должно, а потом проверим там, где он должен появиться.
Шаг 5. Всё равно продолжаем ноуфолловить технические ссылки (корзина, уведомить о наличии и так далее) .
Вот какое базовое регулярное выражение я составил для одного из моих следующих интернет-магазинов на Joomla 2.5.9 + VirtueMart 2.0.20b, естественно, всё только в стадии разработки и по ходу дела может поменяться:
<?php if(preg_match('#\?|^/search|/notify$|^/cart|askquestion|^/manufacturer|^/user|^/2-uncategorised|^/component/#', $_SERVER['REQUEST_URI'])){ ?>
<meta name="robots" content="noindex, nofollow" />
<?php } ?>
Немного тонкостей для тех, кто не переходил на сайт php.net по приведённой в начале статьи ссылке. В отличие от robots.txt, в котором у нас символ звёздочки (*) является любым символом в любых количествах - в PHP эту задачу выполняет точка (.). В то время как звёздочка (*), обозначает 0 или более вхождений заданного символа (класса символов) в строку. То есть если в примере с вопросительным знаком на конце:
preg_match('#/notify/?$#', $_SERVER['REQUEST_URI'])
поменять знак вопроса на *, то это будет обозначать, что слеша на конце может и не быть, а может и встречаться бесконечное число раз подряд:
notify///////////
Пришло время коснуться и производительности данного скрипта, ведь людей, вроде меня (помешанных на скорости загрузки страниц) этот вопрос наверняка уже посещал по ходу чтения статьи. Что ж, хочу вас обрадовать, функция поиска по регулярным выражениям работает достаточно быстро, чтобы об этом можно было даже не задумываться. Особенно учитывая тот факт, что в нашем сеошном случае поиск ведется всего по одной, да ещё и короткой строке.
Так что можете смело использовать регулярные выражения во избежание дублей страниц сайта, не опасаясь за потерю производительности.
В заключении хочу сказать, что, конечно же, данный способ правильнее называть «дополнением к robots.txt», а не его альтернативой, но такое название менее эпично и не так интригует :) И как ни крути, пользы от метода, представленного в данной статье, не меньше ;)
О том, как составить правильный robots.txt вы можете узнать по ссылке.
Всем спасибо за внимание, на сегодня всё. Также предлагаю вам подписаться на обновления (по почте, RSS или через соц. сети), чтобы всегда быть в курсе подобных идей. До встречи на страницах блога Site on!
Обновление от 08.04.2014:
Продолжение этой темы с улучшенным кодом специально для Joomla: читать.
Пожалуйста, прокомментируйте, как Вам моя статья?