Найдены страницы-дубли с GET-параметрами

Категория: Разработка
Теги: Веб-разработка
Опубликовано: 6 января 2022 г. 4:42
Просмотров: 47

Недавно я столкнулся в панели Яндекс.Вебмастер с критической ошибкой "Найдены страницы-дубли с 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 = тогда она ложна), тогда перенаправляем на страницу поиска, а поиск закрыт от индексации полностью.