Использование группы захвата регулярных выражений в 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;


Но переменная не была заполнена.

Почему бы и нет?
772   1  

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

    Ничего не найдено.