在Nginx $ args中使用正则表达式捕获组

时间:2018-07-17 16:49:35

标签: regex nginx

在某些背景下,我正在尝试修复带有重复参数的请求,例如:

/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;,以及为什么有必要

曾经直接在重写中使用了$1捕获组变量:

rewrite ^.*$ $scheme://$host/$uri$is_args$1? permanent;

但是没有填充变量。

为什么不呢?

1 个答案:

答案 0 :(得分: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;
}