nginx

时间:2017-06-29 14:48:28

标签: regex nginx pcre munin

我有这个nginx位置块(来自https://munin.readthedocs.io/en/2.0.8/example/webserver/nginx.html

location ^~ /munin-cgi/munin-cgi-graph/ {
    fastcgi_split_path_info ^(/munin-cgi/munin-cgi-graph)(.*);
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass unix:/var/run/munin/fastcgi-graph.sock;
    include fastcgi_params;
}

似乎nginx正在使用PCRE。 ^ 表示"断言字符串的开始(或多行模式中的行)"来自http://www.pcre.org/original/doc/html/pcrepattern.html,但我无法找到的含义。

由于

1 个答案:

答案 0 :(得分:1)

请勿阅读readthedocs.io上的文档 。有关全面的解释,请阅读实际的文档。

http://nginx.org/en/docs/http/ngx_http_core_module.html#location

我引用:

Syntax:   location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default:  —
Context:  server, location

因此,这告诉我们^~location支持的运营商之一。

换句话说:这根本不是任何正则表达式的一部分,它是一个修饰符。

文档继续:

  

要查找与给定请求匹配的位置,nginx首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后检查正则表达式[...]

这意味着nginx首先通过比较URL前缀(这很快)来尝试找到匹配,如果失败,继续尝试正则表达式(速度要慢得多)。

后面几句话:

  

如果最长匹配前缀位置具有“^〜”修饰符,则不检查正则表达式。

所以这意味着如果某个给定网址存在候选匹配,那么您可以利用^~来阻止nginx尝试使用正则表达式来查找甚至更好的匹配。这是性能优化。

所以,用简单的英语

location ^~ /munin-cgi/munin-cgi-graph/ {
}

表示“所有位置均以/munin-cgi/munin-cgi-graph/开头,并且不打算寻找更好的匹配”