Nginx location 匹配优先级

Last Modified: 2023/06/18

概述

Nginx location 匹配规则很灵活,灵活是优点,也是缺点,因为灵活也就意味着复杂,今天我们一起学习 Nginx 路由匹配规则和优先级。

Location 分类

可以将路由匹配规则分为两大类:

  • 非正则路由规则,或者称之为前缀匹配规则
  • 正则路由规则

前缀匹配规则分为以下三种:

  • location = /some/uri,location = 规则是精确匹配,只有请求 uri 和 = 号后面的路由完全相同才能匹配;
  • location ^~ /some/uri,^~ 规则要求请求 uri 必须以 /some/location 为前缀才能匹配成功;
  • location /some/uri,注意 location 指令和 /some/uri 之间没有任何修饰符,这种路由匹配规则和上面的相同,但是优先级不同,这个在后面会详细说明。

Location 匹配示例

以下使用 表示匹配,× 表示不匹配.

1、location = /a/b

请求 uri 匹配结果
/a/b
/a ×
/b ×

2、location ^~ /a/b

请求 uri 匹配结果
/a/b
/a/b/c
/a ×
/b ×

3、location /a/b

请求 uri 匹配结果
/a/b
/a/b/c
/a ×
/b ×

正则匹配规则分为两种:

  • location ~* /some/.*,~* 后面为一个正则表达式,匹配时不区分大小写;
  • location ~ /some/.*,~ 后面是一个正则表达式,匹配时区分大小写;

Location 匹配优先级

  • 如果请求 uri 和 location = 路由规则完全匹配,则匹配完成,不再匹配其他规则,否则继续匹配。
  • 将请求 uri 和 location ^~location(不带修饰符的规则)规则匹配,找出最长匹配前缀的 location 规则,如果最长匹配前缀的规则为 location ^~,则匹配结束并使用该路由规则处理请求,否则记住最长前缀的路由规则,继续正则匹配;
  • 使用正则路由规则匹配请求 uri,如果找到匹配的路由规则,则使用该规则处理请求,匹配结束。如果没有正则路由规则和请求 uri 匹配,则使用上一步记住的最长前缀的路由规则处理请求。

这里我们需要仔细阅读第二点,从第二点可以看出,location ^~ 规则并不一定比正则表达式路由规则的优先级高,只有 location ^~ 规则是最长匹配前缀的时候,它的优先级才比正则路由规则高。因此我们可以得出以下结论:

  • location = 规则优先级最高,只要请求 uri 和该规则完全匹配,就会使用该规则处理请求;
  • location ^~ 和正则表达式规则的优先级取决于 location ^~ 规则是否是最长前缀匹配规则,如果答案为是,则优先级高于正则,否则优先级低于最长前缀规则。

什么是最长前缀路由规则

假设请求 uri 为 /a/b/c/d.html,并且以下三个路由规则:

  • location /a
  • location ^~ /a/b
  • location /a/b/c

这三个路由规则都可以匹配请求 uri,但是很显然第三个是最长前缀路由匹配规则。

有问题吗?点此反馈!

温馨提示:反馈需要登录