Как убрать повторяющиеся слеши в URL
Адреса site.by/catalog// и site.by/catalog/ для поисковика — две разные страницы. Если сервер отвечает на оба кодом 200, появляются дубли: вес делится между копиями, а в индекс может попасть «неправильный» адрес. Лечится это одним правилом редиректа.
Откуда берутся двойные слеши
- ошибки в шаблоне или меню, где путь склеивается из частей:
$base . '/' . $path; - ссылки, поставленные вручную в текстах;
- внешние сайты, которые ссылаются с ошибкой;
- боты и парсеры, которые перебирают адреса.
Проверить просто: откройте любую страницу, добавьте лишний слеш — site.by//uslugi///. Если страница открылась без перенаправления, проблема есть.
Решение для Apache (.htaccess)
Правило ставится в начало .htaccess, после RewriteEngine On:
RewriteEngine On
RewriteCond %{THE_REQUEST} //
RewriteRule .* /$0 [R=301,L]
Apache сам схлопывает повторяющиеся слеши в переменной пути, поэтому $0 уже содержит чистый адрес, а условие по THE_REQUEST срабатывает только тогда, когда в исходном запросе действительно были двойные слеши.
Решение для nginx
У nginx по умолчанию включена директива merge_slashes on: он склеивает слеши при обработке запроса, но не перенаправляет пользователя. Для редиректа добавьте в блок server:
if ($request_uri ~ "//") {
rewrite ^(.*)$ $1 permanent;
}
Перед применением проверьте конфигурацию командой nginx -t.
Решение для 1С-Битрикс
Если на хостинге Битрикс работает за nginx или правила .htaccess не срабатывают, можно сделать редирект средствами PHP — например, в /bitrix/php_interface/init.php:
$uri = $_SERVER['REQUEST_URI'];
$clean = preg_replace('#/{2,}#', '/', $uri, -1, $count);
if ($count > 0) {
LocalRedirect($clean, false, '301 Moved Permanently');
}
WordPress
WordPress сам обрабатывает часть таких адресов, но не всегда. Надёжнее правило на уровне сервера (см. выше). Плагины редиректов тоже подойдут, но серверное правило работает быстрее и не зависит от обновлений плагинов.
После настройки
- Проверьте несколько адресов с лишними слешами: должен быть один 301 на чистый адрес, без цепочек.
- Найдите и исправьте ссылки с двойными слешами внутри сайта — краулером или поиском по базе.
- Заодно проверьте другие источники дублей: www и без www, http и https, слеш в конце и без него,
index.phpв адресе.
Смотрите также
Вопросы и ответы
Можно ли вместо редиректа указать canonical?
Можно, но редирект надёжнее: canonical для поисковика — подсказка, а 301 — однозначная инструкция. Плюс пользователь сразу видит правильный адрес.
