nginx 的 URL 路径出现 %xx 会影响变量正则匹配,不知有谁遇到过?

2019-02-11 16:40:10 +08:00
 mytry

为了简化问题,我构造了个最简单的案例。版本是最新的 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 了,应该仍然是 & 才对啊。想不通路径里的 % 字符,为什么会影响其他变量的正则匹配?

1327 次点击
所在节点    程序员
1 条回复
mytry
2019-02-11 17:34:25 +08:00
已找到解决方案,正则使用“名字捕获”代替 $1 就没这个诡异的问题了。。。应该是 nginx 的 bug~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/533969

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX