Курс «Администрирование ViPNet-сетей»

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

Категория: Разработка Теги: Веб-разработка Опубликовано: 6 января 2022 г. 11:42
Дубли страниц с GET-параметрами
Дубли страниц с 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 = тогда она ложна), тогда перенаправляем на страницу поиска, а поиск закрыт от индексации полностью.

Похожие материалы:


Код функции-контроллера с декоратором
Разрешить только определенные HTTP запросы при помощи require_http_methods в Django
Автор: Алексей Черемных3 января 2021

В Django существует довольно простой способ разрешить только определенные типы HTTP запросов при помощи декоратора представлений require_http_methods.

Для этого необходимо во …

Форма заявки (пример)
Django автоматическое заполнение поля в модели при её создании
Автор: Алексей Черемных10 января 2021

Появилась необходимость заполнить поле с номером заявки до формирования формы, связанной с моделью, но как это сделать? В интернете много способов, …

Код функции
Простой способ в Django блокировать конкретные IP на всем сайте
Автор: Алексей Черемных3 января 2021

На любом сайте приходится блокировать определенные IP адреса. Если таковых нет, это значит только одно - что этим сайтом никто не …

Установка и настройка easy-thumbnail в Django
Миниатюры в Django при помощи easy-thumbnail
Автор: Алексей Черемных19 июня 2022

Сегодня я расскажу как установить и настроить в Django библиотеку для создания миниатюр easy-thumbnail, которая поможет сжать динамические картинки на веб-странице. …

Код
Способ передать варианты выбора choices в forms.ChoiceField из views.py
Автор: Алексей Черемных21 июня 2021

Недавно сам столкнулся с проблемой передачи вариантов выбора для поля формы с типом виджета Radio и типом формы forms.ChoiceField из views.py. Зачем, …

XmlSitemapGenerator - софт для генерации sitemap.xml без ограничений по урлам
Бесплатная программа для создания карты сайта
Автор: Алексей Черемных30 ноября 2020

Сегодня не так много бесплатных программ для создания карты сайта. Пара штук, и те работают как не очень. О переводе …

Все теги:

Подписка на рассылку свежих статей