Nginx的location优先级

在nginx配置文件中,location主要有这几种形式:

语法:location [=|^~|~|~*|@] /uri/ { … } 
功能: 根据URI的不同需求进行配置,可以使用字符串与正则表达式匹配。 如果要使用正则表达式,你必须指定下列前缀: 
~* 不区分大小写。 
~ 区分大小写。
具体匹配形式如下:
1.  正则匹配 location ~ /abc { }
2.  不区分大小写的正则匹配 location ~* /abc { }
3.  匹配路径的前缀 location ^~ /abc { } 
4.  精确匹配 location = /abc { }
5.  普通路径前缀匹配 location /abc { }

# 优先级:
4 > 3 > 2 > 1 > 5

具体解释:

location = / { 
	# 精确匹配 / ,主机名后面不能带任何字符串 
	[ path A ] 
}

location / { 
	# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 
	# 但是正则和最长字符串会优先匹配 
	[ path B ] 
}

location /documents/ { 
	# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 
	# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 
	[ path C ] 
}

location ~ /documents/Abc { 
	# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 
	# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 
	[ path CC ] 
}

location ^~ /images/ { 
	# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。 
	[ path D ] 
}

location ~* \.(gif|jpg|jpeg)$ { 
	# 匹配所有以 gif,jpg或jpeg 结尾的请求 
	# 然而,所有请求 /images/ 下的图片会被 path D 处理,因为 ^~ 到达不了这一条正则 
	[ path E ] 
}

location /images/ { 
	# 字符匹配到 /images/,继续往下,会发现 ^~ 存在 
	[ path F ] 
}

location /images/abc { 
	# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在 
	# F与G的放置顺序是没有关系的 
	[ path G ] 
}

location ~ /images/abc/ { 
	# 只有去掉 path D 才有效:先最长匹配 path G 开头的地址,继续往下搜索,匹配到这一条正则,采用 
	[ path H ] 
}

测试匹配顺序

1. 以下两个匹配规则同时存在时的匹配结果:

2. 以下三个匹配规则同时存在时的匹配结果:


可以看出:正则匹配要大于通用匹配

3. 多个正则匹配


可以看出:多个正则匹配的时候,只匹配到第一个符合条件的正则;

4. 添加精准匹配


只要存在精准匹配,则优先匹配精准匹配;

总结如下

1 匹配优先级如下

① = 精确匹配
② ^~ 优先匹配常规字符串,匹配后,不检查正则
③ ~* 正则匹配 示例: ~*.(gif|jpg|jpeg)$
④ / documents/ 匹配常规字符 documents 代表目录,可以是其他值
⑤ / 所有location无法匹配,则显示该默认匹配

以上可以都有,也可以都没有,如果都有,则按照以上优先级匹配。

posted @ 2023-04-20 10:24  GaoYanbing  阅读(46)  评论(0编辑  收藏  举报