为了简化问题,我构造了个最简单的案例。版本是最新的 OpenResty ( openresty/1.13.6.2 ),配置如下:
server {
listen 8080;
location / {
set $x $args;
if ($x ~ ^a=(.*)) {
set $x $1;
}
return 200 "[debug]
request_uri: $request_uri
args: $args
x: $x
";
}
}
然后通过 curl 访问。正常案例:
curl "http://127.0.0.1:8080/0/?a=1&b=2"
[debug]
request_uri: /0/?a=1&b=2
args: a=1&b=2
x: 1&b=2
然而 URL 中一旦出现 %xx,结果就不对了:
curl "http://127.0.0.1:8080/%30/?a=1&b=2"
[debug]
request_uri: /%30/?a=1&b=2
args: a=1&b=2
x: 1%26b=2
x 变量里的 & 变成 %26 了,应该仍然是 & 才对啊。想不通路径里的 % 字符,为什么会影响其他变量的正则匹配?
1
mytry OP 已找到解决方案,正则使用“名字捕获”代替 $1 就没这个诡异的问题了。。。应该是 nginx 的 bug~
|