我正在查看一个 nginx 位置块,该^~
位置块之前有此符号(脱字符号后跟波形符)。它有什么作用?我很难用谷歌搜索它。
location ^~ /realestate/ {
uwsgi_pass 127.0.0.1:2340;
include /etc/nginx/uwsgi_params;
}
Run Code Online (Sandbox Code Playgroud)
添加到乔恩的答案并纠正埃里克的误导性答案 - 这^~
不是正则表达式匹配,它是比正则表达式优先级更高的前缀匹配。
来自nginx 文档:
\n\n\n正则表达式使用前面的 \xe2\x80\x9c~*\xe2\x80\x9d 修饰符(对于不区分大小写的匹配)或 \xe2\x80\x9c~\xe2\x80\x9d 修饰符(对于大小写-敏感匹配)。
\n
因此,只有~
带有和修饰符的位置~*
才会被视为正则表达式。
\n\n为了找到与给定请求匹配的位置,nginx 首先检查使用前缀字符串(前缀位置)定义的位置。其中,选择并记住具有最长匹配前缀的位置。然后按照正则表达式在配置文件中出现的顺序进行检查。
\n
这意味着 nginx 首先处理非正则表达式位置,即
\nlocation = /foo/bar
(如果匹配,处理立即结束)location /foo/bar
location ^~ /foo/bar
根据这些规则,可以找到并记住最长的匹配。现在 nginx 将开始评估所有正则表达式位置。但是,重要的部分也写在文档中:
\n\n\n如果最长匹配前缀位置具有 \xe2\x80\x9c^~\xe2\x80\x9d 修饰符,则不会检查正则表达式。
\n
这意味着如果选定的最长前缀位置是,则跳过正则location ^~ /foo/bar
表达式位置并返回匹配。
但是,如果最长前缀位置匹配为location /foo/bar
,则对正则表达式进行求值,并且仅当不适用时才使用匹配位置:
\n\n正则表达式的搜索在第一个匹配处终止,并使用相应的配置。如果没有找到与正则表达式的匹配,则使用之前记住的前缀位置的配置。
\n
所有这些放在一起,就是匹配的优先级:
\n1. `=` Exact match, terminate immediately\n2. `^~` Longest-prefix-match (not regex!)\n3. `~`, `~*` Regular expression case sensitive/insensitive\n4. `/` Longest-prefix-match\n
Run Code Online (Sandbox Code Playgroud)\n数字2和4使用完全相同的匹配机制,唯一的区别是它们对正则表达式匹配的优先级。
\n^~ The defined location url must begin with this syntax
Run Code Online (Sandbox Code Playgroud)
如果该语法匹配,则不会使用正则表达式。因此,在您的情况下,一旦找到文件夹 realestate,搜索就会停止。
但是如果您知道要访问的文件夹并且不想使用正则表达式
location = /realestate/ {
Run Code Online (Sandbox Code Playgroud)
可能是更快的规则
归档时间: |
|
查看次数: |
14983 次 |
最近记录: |