Nginx Location匹配优先规则精辟总结
如果需要把一台机器当成网关使用,不可避免的需要配置Nginx Location配置。一旦设置Location的路径总类过多,发现理清Nginx Location匹配顺序至关重要。但是找了一圈资料,发现要么讲得太复杂、案例理解下来花时间不少,要么讲得含糊不清。其实可以用很精炼的文字总结,不需要花过多时间、死脑细胞去理解。
Location 的匹配并不完全按照其在配置文件中出现的顺序来匹配,请求URI 会按如下顺序进行匹配:
1. location = # 精准匹配
2. location ^~ # 带参前缀匹配
3. location ~ # 正则匹配(区分大小写)
4. location ~* # 正则匹配(不区分大小写)
5. location /a # 普通前缀匹配,优先级低于带参数前缀匹配。
6. location / # 任何没有匹配成功的,都会匹配这里处理
上述匹配规则可以用以下伪代码表示,加深理解:
function match(uri){
rv = NULL
if uri in exact_match://匹配规则1
return exact_match[uri]
if uri in prefix_match:
if prefix_match[uri] is '^~'://匹配规则2
return prefix_match[uri]
else://匹配规则5,注意这里没有 return,且这里是按最长匹配处理
rv = prefix_match[uri]
if uri in regex_match://匹配规则3、4
return regex_match[uri] // 按文件中顺序,找到即返回
//前面规则1、2、3、4都没匹配中,最后匹配规则6
return rv
}