Найдены страницы-дубли с GET-параметрами
Недавно я столкнулся в панели Яндекс.Вебмастер с критической ошибкой "Найдены страницы-дубли с GET-параметрами" и начал читать инструкции от других специалистов и оказалось, что многие советуют просто закрыть при помощи директивы Disallow в robots, но в данном случае она не помогает совсем.
Что такое дубли страниц с GET-параметрами?
В яндекс вебмастере объясняют предельно ясно - некоторые страницы, которые могут быть доступны по двум адресам, например:
- site.ru/katalog/acer-5560g/
- site.ru/katalog/acer-5560g/?type=rss
Иными словами, страничка с описанием ноутбука acer aspire 5560g будет доступна по двум адресам, и выдавать она будет одинаковый контент, только с разным оформлением.
Мой личный опыт с дублями веб-страниц вместе с get параметрами
У меня до этого сайт был на Joomla 3 (речь не про mrkaban.ru) и эта CMS очень любит создавать тьму таких страниц, по началу я их закрывал через роботс, некоторые функции даже из исходного кода убирал, но после обновления CMS всё возвращалось обратно. Когда появилась необходимость ускорить загрузку сайта - поставил компоненты для кеширования, и получил нереально количество мусорных страниц подобного вида (страницы-дубли с get-параметрами). Самое обидно в том, что закрыть их крайне сложно, так как параметры и алиасы каждый раз разные были.
В итоге, решил перейти на Django и сейчас доволен, но с такой ошибкой я все таки встретился. У меня были все внешние ссылки закрыты при помощи redirect.php и после перехода все эти страницы стали возвращать 404, но я решил, что это плохо и придумал способ исправить - сделал 301 редирект через htaccess с redirect.php на главную страницу. Все вроде хорошо, но у меня появилась критическая ошибка в яндекс вебмастер "Найдены страницы-дубли с GET-параметрами" и в качестве примеров были страницы:
- site.ru/?site=https://gnu.org/
- site.ru/catalog/?type=rss
- site.ru/catalog/?type=atom
Все пишут, как один из вариантов, мол можно закрыть при помощи robots - просто укажите Disallow: *?site=*, но это не помогает, проверил лично. Добавлял эту директиву, закидывал интересующие страницы в переобход, они в этот же день переиндексировались, но эффекта в течении недели 0 - не просто 0, а 0.0 (ноль целых ноль десятых).
Толку нет закрывать параметр при помощи директивы Disallow в robots, если страницу с этим параметром разрешено индексировать, так как яндекс и гугл с высокой долей вероятности проигнорирует этот запрет. Да, эта страница не попадёт в органический поиск, но яндекс найдёт дубль или ошибку и будет вас об этом уведомлять. Кстати, наличие уведомлений об ошибках может означать некоторую пессимизацию, поэтому в яндекс вебмастере не должно быть сообщений об ошибках.
Как исправить проблему с страницами-дублями с GET-параметрами?
Теперь буду предлагать работающие варианты исправления ошибки "Найдены страницы-дубли с GET-параметрами", которые проверил лично.
Директива Clean-param в Robots.txt
Самый простой способ решения проблемы, не требующий необходимости править код сайта.
Просто укажите страницы и конкретный get-параметр, который нужно очищать на них для исключения подобных дублей, вот пример:
User-agent: *
Clean-param: type /category/arhivatory/
Clean-param: type /faq/
Clean-param: type /category/mediapleery/
Clean-param: type /category/paroli/
Clean-param: type /category/ide/
Disallow: /*type=rss*
Sitemap: https://site.ru/sitemap.xml
Host: https://site.ru
Для страницы faq необходимо очищать параметр type. Всё гениально просто и это работает, проверил лично.
Перенаправление через CMS
Можно сделать перенаправление через CMS сайта, например, в моем случае при помощи views.py в Django. Простой пример для контроллера:
from django.http import HttpResponseRedirect
from django.shortcuts import redirect
durl = str(self.request.build_absolute_uri)
try:
if 'site=' in durl:
return redirect('categories')
except:
ret = HttpResponseRedirect('https://site.ru/categories/')
return ret
По сути redirect это ярлык на тот же HttpResponseRedirect, но в данном случае написано именно так, так как я пытался поймать и отладить ошибку. И оказывается это очень плохой вариант, вызывающий целую череду ошибок, поэтому не советую даже вникать в ошибки, так как исправишь одну - тут же появится другая.
Перенаправление через Шаблон
Страницы дубли с get-параметрами можно закрыть при помощи html шаблона, на основании которого CMS формирует конечную веб-страницу. Нечто подобное есть во всех CMS.
Чтобы было проще, в контроллер обрабатывающий страницу с ошибкой во views.py добавил следующий код:
try:
site = self.request.GET.get('site')
if site:
context['site'] = site
except:
pass
Параметр site можно заменить на ваш параметр.
Теперь переходим в сам шаблон веб-страницы и вставляем в блок с мета-описаниями:
{% if site %}
<meta http-equiv="REFRESH" content="0;url=https://site.ru/search/?s={{ site }}">
{% endif %}
Если site истина (если переменная имеет значение None = тогда она ложна), тогда перенаправляем на страницу поиска, а поиск закрыт от индексации полностью.