Nginx位置匹配中的变量捕获

sky*_*ork 35 regex nginx

假设我有一个这样的URL www.example.com/a/b/sth:,我在Nginx配置中写了一个位置块:

location ^~ /a/b/(?<myvar>[a-zA-Z]+) {
    # use variable $myvar here
    if ($myvar = "sth") { ... }
}
Run Code Online (Sandbox Code Playgroud)

我希望能够使用$myvar从块的URL捕获的变量,但是,Nginx一直告诉我这个变量没有定义,也不会启动:

nginx: [emerg] unknown "myvar" variable
Run Code Online (Sandbox Code Playgroud)

Ste*_*ini 58

老线程,但我有同样的问题......

我认为该错误与安装的PCRE版本无关

如果您的位置标记不是以〜开头,则NGINX不会解析您的正则表达式.您需要使用类似的东西

location ~ ^/a/b/(?<myvar>[a-zA-Z]+) {
   # use variable $myvar here
   if ($myvar = "sth") { ... }
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*rov 13

正如Stefano Fratini在他的回答中正确指出的那样,你的location声明有一个错误:对于正则表达式,你应该~单独使用,而不是^~.


命名捕获是PCRE的一项功能,它们在不同版本中具有不同的语法.对于您使用的语法,?<var>您必须至少拥有PCRE 7.0.

请参阅官方Nginx文档中的大量信息

  • 您指向官方documentain的链接指向server_name指令。这并未阐明在其他正则表达式位置中使用命名捕获(例如,位置或重写指令) (2认同)
  • @AlexanderAzarov 与反复试验、阅读源代码或假设没有什么不同吗?什么版本的 nginx 没有什么不同?是否确实记录在案,未记录在案,未知? (2认同)

小智 6

^〜不是正则表达式匹配项,它代表最长的匹配前缀。您应该使用〜或〜*(不区分大小写)