Несколько месяцев назад начал замечать в Яндекс.Вебмастере индексацию дублей страниц со знаком вопроса в конце URL:
- https://libramedia.ru/?
- https://libramedia.ru/blog/?
По времени это примерно совпало с анонсом новой механики в Яндекс.Вебмастере:
Яндекс тестирует новую механику для более точного распознавания поисковых фраз в браузерах с ограничением межсайтовых cookies. Вы можете заметить новый параметр ysclid у части ссылок из результатов поиска на свой сайт. Подробнее
Самое забавное, что ссылок с параметрами ?ysclid я после появления данного анонса не заметил ни разу. Зато сразу на нескольких проектах начали индексироваться дубли страниц с вопросительными знаками в конце URL.
Итак, задача состоит в следующем: избавиться от появления подобных дублей, не повлияв при этом на работу начинающихся с вопросительного знака GET-параметров (что было бы чревато проблемами — например, в Bitrix стандартная пагинация работает путем добавления параметра ?PAGEN_1 к адресам разделов).
Немного подумав, нашел 3 варианта решения — для Apache, nginx и универсальный редирект на PHP.
Редирект через .htaccess
Данный способ подойдет для веб-сервера Apache, поддерживающего директивы из конфигурационного файла .htaccess:
# Убираем знак вопроса в конце URL (/?) RewriteCond %{THE_REQUEST} ^[^\s]+\s+[^?]*?\? RewriteCond %{QUERY_STRING} ^$ RewriteRule .? %{REQUEST_URI}? [R=301,L]
Редирект в nginx
Если вы пользуетесь VPS и отошли от связки nginx + Apache в пользу связки nginx + PHP-FPM, то для избавления от редиректа нужно добавить следующую директиву в блок server конфига интересующего вас сайта:
# Убираем знак вопроса в конце URL (/?) if ($request_uri ~ "^(.*)\?$") { return 301 $1; }
Редирект на PHP
И, наконец, универсальный вариант с редиректом на PHP, который можно использовать если недоступны первые два (например, хостинг на nginx, но нет административного доступа к серверу).
Добавьте следующий код в header.php или любой другой сквозной элемент сайта:
<?php //Убираем знак вопроса в конце URL (/?) $uri = $_SERVER['REQUEST_URI']; $q = strpos($uri, '?'); if ($q === strlen($uri) - 1) { header('HTTP/1.1 301 Moved Permanently'); header('Location: ' . substr($uri, 0, $q)); } ?>
Заключение
Борьба с появлением дублей страниц — одна из базовых задач технического SEO. Во многом помогает правильное внедрение атрибута rel=«canonical», но использование канонических ссылок не является 100% гарантией отсутствия возникновения различного «мусора» в поисковой выдаче.
Стоит регулярно мониторить отчеты об индексации продвигаемых ресурсов и пресекать возможные проблемы с дублями сразу же после их возникновения.