Как настроить 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&param2=value2/location/russia/?param1=value1&param2=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, чтобы убедиться в правильности работы.

    Часто задаваемые вопросы