@Otrivin
junior full-stack сисадмин

Как использовать шаблоны подстановки в htaccess?

Здравствуйте!

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

Редирект вида:
/articles/?start=10  =>  /articles/?page=1
/vse-novosti/?start=10  =>  /vse-novosti/?page=1


Вот мои правила:
RewriteCond %{REQUEST_URI} ^/(articles|vse-novosti)/$ [NC]
RewriteCond %{QUERY_STRING} start=([0-9])([0-9]) [NC]
RewriteRule .* /%1/?page=%2 [R=301,L] # рассчитываем на /articles/?page=1


Т.е. планировалось получить через первое условие (%{REQUEST_URI}) раздел, затем через второе (%{QUERY_STRING}) цифру, а третье игнорировать.

Но в итоге я получаю url: https://site.ru/1/?page=0. Такое чувство, что результаты обработки регулярки из %{REQUEST_URI} просто затираются результатами из следующей строки - на место %1 попадает первое ([0-9]) из %{QUERY_STRING}.

Подскажите, пожалуйста, как это работает? Почему в %1 лежит результат не из %{REQUEST_URI}, а из %{QUERY_STRING} ? Не хочется дублировать правило для разных разделов
  • Вопрос задан
  • 91 просмотр
Решения вопроса 2
p00h
@p00h
Фехтовальщик-стропальщик
В документации пишут:

These are backreferences of the form %N (0 <= N <= 9). %1 to %9 provide access to the grouped parts (again, in parentheses) of the pattern, from the last matched RewriteCond in the current set of conditions

Ссылки идут на совпадение из последнего правила RewriteCond. Следовательно, вы не сможете ссылаться на оба правила.
Ответ написан
@dodo512
RewriteCond %{QUERY_STRING} start=([0-9]+)[0-9]
RewriteRule ^(articles|vse-novosti)/$ /$1/?page=%1 [R=301,L]


RewriteCond %{THE_REQUEST} " /(articles|vse-novosti)/\?start=([0-9]+)[0-9]"
RewriteRule .* /%1/?page=%2 [R=301,L]
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы