Nginx位置匹配中的变量捕获

时间:2012-12-04 15:48:28

标签: regex nginx

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

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

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

nginx: [emerg] unknown "myvar" variable

4 个答案:

答案 0 :(得分:56)

旧线程,但我遇到了同样的问题...

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

如果您的位置标记不是以〜开头,那么NGINX无法解析您的正则表达式 你需要使用这样的东西

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

答案 1 :(得分:12)

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


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

请参阅official Nginx documentation

中的详细信息

答案 2 :(得分:6)

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

答案 3 :(得分:3)

未经测试,但使用PCRE将块捕获到命名变量的正确方法是(?P)。所以你的例子错过了P.