Libra Media работает на хостинге Beget. Хочешь свой сайт? Регистрируйся и получи любой тариф бесплатно на месяц!
Как убрать в конце URL знак вопроса - редирект с /? в .htaccess, nginx, на PHP

Редирект со знака вопроса в конце URL

Опубликовано: 14.06.2022
2 минуты на чтение

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

Стоит регулярно мониторить отчеты об индексации продвигаемых ресурсов и пресекать возможные проблемы с дублями сразу же после их возникновения.

Автор статьи:
Дмитрий
С 2013 года профессионально занимается созданием и продвижением коммерческих и информационных веб-сайтов. В 2018 году завел блог Libra Media, в котором делится опытом и практическими наработками в сфере SEO, администрирования серверов и доработок для сайтов на Bitrix и WordPress.
#Администрирование

5 комментариев к “Редирект со знака вопроса в конце URL”

  1. Наталья

    Здравствуйте, подскажите, как убрать не только знак вопроса в конце url, но другие знаки — * и добавления в конце адреса случайных букв и символов, например https://site.ru/hgf или https://site.ru/* ?

    1. На обращения к заведомо несуществующим страницам сайт должен отвечать ошибкой 404. Если это не так, то либо надо смотреть настройки CMS (например, в Битриксе при некоторых настройках компонентов не будет выдаваться код 404 ошибки), либо обращаться к разработчику сайта (если он самописный и в его основе не лежит какой-либо из общеизвестных движков).

      То есть это не тот случай, когда требуется делать редиректы.

  2. Наталья

    Подскажите, пожалуйста, как правильно прописать в robot.txt директиву clean param, чтобы запретить к индексации дубли url со знаком вопроса в конце?

    1. Через Clean-param вы «пустые» знаки вопроса не закроете, эта директива обрабатывает только то, что идет после данных знаков.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *