46

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

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

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

nginx: [emerg] unknown "myvar" variable
4

4 回答 4

68

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

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

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

location ~ ^/a/b/(?<myvar>[a-zA-Z]+) {
   # use variable $myvar here
   if ($myvar = "sth") { ... }
}
于 2013-05-08T02:04:41.443 回答
15

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


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

请参阅官方 Nginx 文档中的详细信息

于 2012-12-06T08:04:11.763 回答
7

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

于 2017-03-13T09:53:47.837 回答
3

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

于 2012-12-06T07:34:24.477 回答