在Nginx位置匹配中使用括号进行变量捕获

时间:2016-03-24 13:56:58

标签: php regex nginx pattern-matching nginx-location

我有这个位置规则:

XE_FILE_TARGET_TVF

它适用于以下网址:

location ~ ^/banks/(?P<region>[\w/~\-]+?)/responses/?$ {
    rewrite ^ $scheme://${host}/services/responses/list/city/${region}/? permanent;
}

但现在我需要修改我的位置以匹配其中带括号的网址。我用这个版本:

http://example.com/banks/Arhangel~skaya_oblast~/Mirnyiy/responses/

但是网址location ~ ^/banks/(?P<region>[\w/~\-()]+?)/responses/?$ { rewrite ^ $scheme://${host}/services/responses/list/city/${region}/? permanent; } 没有重写。

我用php documentation函数检查这个模式:

/banks/Respublika_Saha_(Yakutiya)/Neryungri/responses/

它会返回preg_match('|^/banks/(?P<region>[\w/~\-()]+?)/responses/?$|', '/banks/Respublika_Saha_(Yakutiya)/Neryungri/responses/'); ,因此此模式会将网址与1(匹配。

此外,我用python re.search检查这个字符串:

)

它返回import re matches = re.search('|^/banks/(?P<region>[\w/~\-()]+?)/responses/?$|','/banks/Respublika_Saha_(Yakutiya)/Neryungri/responses/') print matches.start() ,因此此模式从头开始匹配此字符串。

但是nginx并不这么认为。

如何修改nginx位置规则以匹配此网址0

P.S。我的nginx版本是/banks/Respublika_Saha_(Yakutiya)/Neryungri/responses/

1 个答案:

答案 0 :(得分:0)

对不起这个问题。 Nginx完美运作。问题不在于nginx,而在于我们的devops(几乎没有dev和非常糟糕的操作)。下面我添加我们系统的方案。简而言之,系统由以下部分组成:nginx平衡器,apache遗留系统,用于新的基于soa的系统的nginx,用于服务的nginx。

我咨询了devops,他们告诉我在我们的一个git repos中更改某些nginx配置。我已经改变它,记住平衡器配置,但我们的devops忘记了nginx平衡器,因为它没有版本控制。所以我已经为新的SOA系统更改了nginx配置,但是这个重定向应该会在平衡器阶段将我们的用户从旧系统发送到新系统。

我对我们的devops感到非常沮丧,所以Nginx可以工作,但他们没有... :)

enter image description here