301 редирект с исключением папки /catalog: универсальное правило htaccess
При переносе структуры сайта часто требуется убрать из URL промежуточный сегмент, например, /catalog. Задача: настроить 301 редирект, который преобразует /catalog/раздел/подраздел/товар в /раздел/подраздел/товар, сохраняя всю вложенность. Простое правило с [^/]+ работает только для одного уровня, поэтому нужен более гибкий подход.
Почему простое правило не подходит?
Правило RewriteRule ^catalog/([^/.]+)/?$ https://site.ru/$1 [R=301,L] захватывает только первый сегмент после /catalog/ и игнорирует всё, что идёт дальше. Это приводит к потере подразделов и названий товаров, что плохо для SEO и пользовательского опыта.
Универсальное решение для всех уровней вложенности
Чтобы редирект работал для любого количества сегментов, используйте шаблон (.*) - он захватывает всю оставшуюся часть URL после папки /catalog. Вот готовое правило для файла .htaccess:
RewriteEngine On
RewriteRule ^catalog/(.*)$ https://site.ru/$1 [R=301,L]Это правило перехватывает любой запрос, начинающийся с /catalog/, и перенаправляет на тот же путь без /catalog. Например:
/catalog/раздел→/раздел/catalog/раздел/подраздел→/раздел/подраздел/catalog/раздел/подраздел/товар→/раздел/подраздел/товар
Важные нюансы и рекомендации
Проверка на дублирующийся слеш
Если в конце URL может быть слеш, правило всё равно сработает корректно, так как (.*) захватывает и его. Однако для единообразия лучше задать канонический адрес (со слешем или без) и дополнительно настроить редирект для удаления/добавления слеша.
Исключение конкретных страниц
Если нужно исключить из редиректа определённые страницы внутри /catalog, добавьте условие RewriteCond перед правилом. Например, исключим страницу /catalog/special:
RewriteCond %{REQUEST_URI} !^/catalog/special [NC]
RewriteRule ^catalog/(.*)$ https://site.ru/$1 [R=301,L]Тестирование перед публикацией
Перед применением правила на production-сервере обязательно протестируйте его в локальной среде или с помощью инструментов вроде Redirect Path (Chrome-расширение) или HTTP Status Code Checker. Убедитесь, что все внутренние ссылки и карта сайта обновлены.
Что делать, если редирект не срабатывает?
Проверьте, включён ли модуль mod_rewrite в Apache. Убедитесь, что файл .htaccess расположен в корневой директории сайта и имеет права на чтение. Иногда редирект блокируется кэшированием браузера - очистите кэш или используйте режим инкогнито.
Настройка 301 редиректа с удалением папки - простая задача, если использовать правильный синтаксис. Универсальное правило с (.*) решает проблему для любых уровней вложенности и помогает сохранить SEO-вес страниц.