我正在查看一个 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/.* 这可能是更准确的表示方式