Как настроить 301 редирект с /city/ на /location/ с сохранением GET-параметров
При переносе структуры URL часто возникает задача заменить один сегмент пути на другой, сохранив все GET-параметры. В вашем случае нужно перенаправить /city/russia/?param1=value1 на /location/russia/?param1=value1. Рассмотрим, почему стандартное правило работает только без параметров, и как это исправить.
Почему правило не срабатывает с GET-параметрами
В вашем правиле RewriteRule ^city/(.*)$ /location/%1 [R=301,L,QSA] флаг QSA (Query String Append) добавляет исходные параметры к новому URL, но проблема в том, что RewriteRule по умолчанию не захватывает строку запроса. Когда в URL есть ?, RewriteRule видит только путь до вопросительного знака. Однако ваше регулярное выражение ^city/(.*)$ корректно обрабатывает путь, а %1 берёт значение из RewriteCond, которое тоже не включает query string. В итоге редирект происходит без параметров.
Правильное решение для .htaccess
Чтобы редирект работал с любыми GET-параметрами, достаточно использовать только RewriteRule с обратной ссылкой $1 и флагом QSA. Условие RewriteCond в данном случае избыточно. Вот исправленное правило:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^city/(.*)$ /location/$1 [R=301,L,QSA]
</IfModule>Это правило захватывает всё, что идёт после /city/ (включая подпапки и имя файла), и подставляет это в новый путь. Флаг QSA автоматически добавляет исходную строку запроса (параметры после ?) к новому URL.
Примеры работы
- Без параметров:
/city/russia/→/location/russia/ - С параметрами:
/city/russia/?param1=value1¶m2=value2→/location/russia/?param1=value1¶m2=value2 - С вложенными путями:
/city/russia/moscow/?page=2→/location/russia/moscow/?page=2
Дополнительные рекомендации
Если вы хотите перенаправлять только конкретные регионы, используйте более точное регулярное выражение, например ^city/(russia|usa|germany)/. Для отладки редиректов временно замените R=301 на R=302, чтобы браузер не кэшировал ошибочное перенаправление. После проверки верните постоянный статус.
Распространённые ошибки
- Использование %{REQUEST_URI} в RewriteCond - это условие проверяет путь, но не влияет на захват параметров, поэтому его можно опустить.
- Пропуск флага QSA - без него все GET-параметры будут потеряны.
- Экранирование символов - в .htaccess не нужно экранировать точку или слэш, если они не входят в регулярное выражение.
Теперь ваш редирект будет корректно обрабатывать любые URL с параметрами. Проверьте правило в браузере или с помощью curl, чтобы убедиться в правильности работы.