Regex Nginx位置匹配中的变量捕获

Regex Nginx位置匹配中的变量捕获,regex,nginx,Regex,Nginx,假设我有这样一个URL:www.example.com/a/b/sth,我在Nginx config中写了一个位置块: location ^~ /a/b/(?<myvar>[a-zA-Z]+) { # use variable $myvar here if ($myvar = "sth") { ... } } 未经测试,但使用PCRE将块捕获到命名变量中的正确方法是(?p)。因此,您的示例遗漏了P.正如Stefano Fratini在其回答中正确指出的那样,您的位置

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

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

未经测试,但使用PCRE将块捕获到命名变量中的正确方法是(?p)。因此,您的示例遗漏了P.

正如Stefano Fratini在其回答中正确指出的那样,您的

位置
声明有一个错误:对于正则表达式,您应该单独使用
~
,而不是
^


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


请查看旧线程中的详细信息,但我遇到了相同的问题

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

如果位置标记不是以~ 你需要用这样的东西

location ~ ^/a/b/(?<myvar>[a-zA-Z]+) {
   # use variable $myvar here
   if ($myvar = "sth") { ... }
}
location~ ^/a/b/(?[a-zA-Z]+){
#在这里使用变量$myvar
如果($myvar=“sth”){…}
}

^~不是正则表达式匹配,它代表最长的匹配前缀。
您应该使用~或~*(case instive)来代替

您到底想实现什么?因为您应该尽量避免使用
if
->是什么阻止了您使用
$1
?这只适用于较旧版本的PCRE。更新的版本只允许使用问号。@cliff.wells,除非您要说明确切的版本划分,否则您的评论在2014年肯定是正确的。但这个答案是在2012年给出的,发行版中的默认nginx版本可以追溯到1.2/1.3。我不太确定(?)是否被纳入了这些版本中。当时的所有文档都引用了P.your链接到官方文档in points to server_name指令。这并没有说明命名捕获在其他regexp位置的使用(例如位置或重写指令)@Perlover这没什么不同。@AlexanderAzarov这与尝试和错误、阅读源代码或假设没有区别吗?nginx的哪个版本没有什么不同?是否确实有记录,没有记录,未知?
location ~ ^/a/b/(?<myvar>[a-zA-Z]+) {
   # use variable $myvar here
   if ($myvar = "sth") { ... }
}