假设我有一个这样的网址: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
答案 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。
答案 2 :(得分:6)
^〜不是正则表达式匹配,它代表最长的匹配前缀。 你应该使用〜或〜*(不区分大小写)
答案 3 :(得分:3)
未经测试,但使用PCRE将块捕获到命名变量的正确方法是(?P)。所以你的例子错过了P.