Использование группы захвата регулярных выражений в nginx $args
В качестве некоторого фона я пытаюсь исправить запросы, которые поступают с дублированными парами, например:
/products/compare/?ids=554?ids=554
/products/compare/?ids=595,662,726?ids=595,662,726
Мое исправление-которое работает-выглядит следующим образом:
location /products/compare/ {
if ( $args ~ "(ids=[d,]+)?ids=[d,]+" ) {
set $id $1;
rewrite ^.*$ $scheme://$host/$uri$is_args$id? permanent;
}
}
Мой вопрос касается set $id $1;, и почему это необходимо
I был , используя переменную $1 capture-group непосредственно в перезаписи:
rewrite ^.*$ $scheme://$host/$uri$is_args$1? permanent;
Но переменная не была заполнена.
Почему бы и нет?
1 ответ:
Первым параметром Директивы
rewriteявляется регулярное выражение, которое может содержать нумерованные захваты. В результате все нумерованные захваты сбрасываются при вводе оператораrewrite.В качестве альтернативы использованию директивы
setможно использовать именованный захват в регулярном выражении оператораif.Например:
if ( $args ~ "(?<id>ids=[\d,]+)\?ids=[\d,]+" ) { rewrite ^ $scheme://$host/$uri$is_args$id? permanent; }
Конечно, на самом деле вам не нужно использоватьrewrite. Если вы используетеreturnвместо этого, числовой захват остается в масштаб.Например:
if ( $args ~ "(ids=[\d,]+)\?ids=[\d,]+" ) { return 301 $scheme://$host/$uri$is_args$id; }
Comments