目录
- 一、知识回顾
- 1.什么是 location
- 2.location 语法
- 3.location 的匹配规则
- 4.优先级排序
- 二、如何根据关键字筛选请求
- 1.实现方案
- 2.测试结果
一、知识回顾
1.什么是 location
Nginx 中通过根据 location
块的规则来将匹配到的 URL 请求进行一系列操作,最常见的就是进行代理。Nginx 中一个 Server 可以有多个 location 配置,当请求在与多个 location 匹配时,会根据一定的 location 匹配规则和优先级来确定具体将请求分发到哪个 location。
2.location 语法
# |指令| |前缀| |匹配的网站网址| |匹配URI之后要执行的配置段|
location [=|^~|~|~*] /uri/ { ... }
3.location 的匹配规则
匹配规则 | 说明 |
---|---|
没有前缀 | 普通匹配(遵循最大前缀匹配规则)。 |
= | 精确(严格)匹配。 |
~ | 区分大小写的正则匹配。 |
~* | 不区分大小写的正则匹配。 |
^~ | 匹配 URI 以某个常规字符串开头,^ 为正则表达式中的开头。 |
!~ | 区分大小写不匹配的正则。 |
!~* | 不区分大小写不匹配的正则。 |
/ | 通用匹配,任何请求都会匹配到。 |
由此我们可以根据是否按照正则匹配将 location 的匹配规则划分为两类:
- 普通location: 包括
没有前缀
、=
、^~
、@
四种。其中@
时用作服务内部的一种转发行为,很少用。 - 正则location: 包括
~
、~*
、!~
、!~*
四种。
4.优先级排序
具体的匹配顺序生效规则如下:
- 普通 location 与正则 location 之间的匹配:选择出 “普通 location” 的最大前缀匹配结果后,还需要继续搜索正则 location。如果继续搜索的 “正则 location” 也有匹配上的,那么 “正则 location” 覆盖 “普通 location” 的最大前缀匹配。
- 普通 location 之间:最大前缀匹配。
- 正则 location 之间:按照正则 location 在配置文件中的物理顺序(编辑顺序)匹配,并且只要匹配到一条正则 location,就不再考虑后面的。
- 以上 “普通 location” 指的是
没有前缀
和@
,=
和^~
在匹配到结果后就不再需要继续匹配 “正则 location” 了(^ 表示 “非”,~ 表示 “正则”,字符意思是:不要继续匹配正则)。=
和^~
共同点:都可以阻止继续匹配 “正则 location”。=
和^~
不同点:^~
依然遵守 “最大前缀” 匹配规则,然而=
不是 “最大前缀”,而是必须是严格匹配(exact match)。
所有类型location存在时,优先级排序为:
=
匹配 > ^~
匹配(不是用正则,最大前缀匹配) > 正则匹配 > 没有前缀(最大前缀匹配) > 默认(/)
location / {} 和 location = / {} 的区别:
location / {}
遵守普通 location 的最大前缀匹配,由于任何 URI 都必然以 / 根开头,所以对于一个 URI,如果有更 specific 的匹配,那自然是选这个更 specific 的,如果没有,/ 一定能为这个 URI 点背(至少能匹配到 /)。也就是说,location / {} 有默认配置的意思,其他更 specific 的配置能 orverwrite 这个默认配置(这也是为什么我们总能看到 location / {} 这个配置的原因)。location = / {}
遵守的是 “严格精确匹配 exact match”,也就是只能匹配 http://host:port/ 请求,同时会禁止继续搜索正则 location。因此如果我们只想对 “GET /” 请求配置作用指令,那么我们可以选 location = / {},这样能减少正则 location 的搜索,因此效率比 location / {} 高(注:前提是我们的目的仅仅只想对 “GET /” 起作用)。
二、如何根据关键字筛选请求
1.实现方案
可以利用以下四种匹配规则实现:
匹配规则 | 说明 |
---|---|
~ | 区分大小写的正则匹配。 |
~* | 不区分大小写的正则匹配。 |
!~ | 区分大小写不匹配的正则。 |
!~* | 不区分大小写不匹配的正则。 |
例如,我想根据 swagger 关键字进行筛选,将带有 swagger 的请求全部拦截,我们可以这么实现:
location ~* swagger {
return 404;
}
2.测试结果
访问地址:http://localhost:8081/swagger-ui.html
整理完毕,完结撒花~ 🌻
参考地址:
1.Nginx之location匹配规则,https://www.cnblogs.com/gaoyanbing/p/16915446.html