在某些背景下,我正在尝试修复带有重复参数的请求,例如:
/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;
但是没有填充变量。
为什么不呢?
答案 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;
}