nginx location 块中的 location ^~ 是什么意思

nginx location 块中的 location ^~ 是什么意思

我正在查看一个 nginx 位置块,^~该位置块前面有此符号(插入符号后跟波浪符号)。它是做什么的?我在谷歌上搜索它时遇到了困难。

location ^~ /realestate/ {
    uwsgi_pass 127.0.0.1:2340;
    include /etc/nginx/uwsgi_params;
}

答案1

补充 Jon 的回答并纠正 Eric 的误导性回答 - 这^~不是正则表达式匹配,而是比正则表达式具有更高优先级的前缀匹配。

来自nginx 文档

正则表达式用前面的“~*”修饰符(用于不区分大小写的匹配)或“~”修饰符(用于区分大小写的匹配)指定。

所以,仅有的~带有和修饰符的位置~*将被视为正则表达式。

为了找到与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照配置文件中出现的顺序检查正则表达式。

这意味着 nginx 首先处理非正则表达式位置,即

  • location = /foo/bar(如果匹配,处理立即结束)
  • location /foo/bar
  • location ^~ /foo/bar

从这些规则中,找到并记住最长的匹配项。现在 nginx 将评估所有正则表达式位置。但重要的部分也写在文档中:

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

这意味着,如果选定的最长前缀位置是location ^~ /foo/bar,则正则表达式位置被跳过比赛重新开始。

但是,如果最长前缀位置匹配为location /foo/bar,则评估正则表达式,并且仅当不适用时才使用匹配的位置:

正则表达式的搜索在第一次匹配时终止,并使用相应的配置。如果没有找到与正则表达式匹配的配置,则使用先前记住的前缀位置的配置。

所有这些放在一起,就是关于匹配的优先级:

1. `=`       Exact match, terminate immediately
2. `^~`      Longest-prefix-match (not regex!)
3. `~`, `~*` Regular expression case sensitive/insensitive
4. `/`       Longest-prefix-match

数字 2 和 4 使用完全相同的匹配机制,唯一的区别是它们针对正则表达式匹配的优先级。

答案2

^~  The defined location url must begin with this syntax

如果该语法匹配,则不会使用正则表达式。因此,在您的情况下,一旦找到文件夹 realestate,搜索就会停止。

但如果你知道要访问的文件夹并且不想使用正则表达式

location = /realestate/ {

可能是更快的规则

答案3

^ 是 uri 匹配的开始 ~ 表示正则表达式匹配

在这种情况下,使用正则表达式匹配时,没有明确结束的 /realestate/ 将匹配以 /realestate/ 开头的 uri

更明确地,如果你的意图是匹配 /realestate/ 确切位置 = /realestate/ 将会是一个更快、更优化的匹配

如果你的意图确实是这样的

位置 ^~ /realestate/.* 这可能是更准确的表示方式

相关内容