NGINX 之 location 匹配优先级

章节

1 NGINX 的源码安装

2 NGINX 核心配置详解

3 NGINX 之 location 匹配优先级

4 NGINX 基础参数与功能

目录

1 location 基础语法

1.1 location 语法说明表

1.2 URI部分简单介绍

2 location 匹配优先级

2.1 URI匹配的规则与顺序

2.2?精确匹配(location = /1.txt)

2.3?区分大小写(location ~ .(txt|html|php|png)$)

2.4?不区分大小写(location ~* .(txt|html|php|png)$)

3 URI优先级匹配案例

3.1 几种方式测试文件匹配优先级

3.1.1 测试location 的访问(同一个文件名不相同的目录)

3.1.2 测试结果

3.1.3 location /documents 存在的特殊性

3.1.4 总结文件匹配测试

3.2 几种方式测试目录匹配优先级

3.2.1 同一文件名不同目录 且 匹配规则是目录

3.2.2 创建目录与index.html 文件

3.3.3 实现效果

3.3.4 总结目录匹配


1 location 基础语法

location 指令的作用是根据用户请求的URI来执行不同的应用。 location使用的语法为

location [=|~|~*|^~] uri {
  ....
}

1.1 location 语法说明表

location

[=||*|^~]

uri

{…}

指令

匹配标识

匹配的网站地址

匹配URI后要执行的配置段

1.2 URI部分简单介绍

~ 与~* 的区别 ~ 匹配内容区分大小写 ~* 匹配内容不区分的小写

!~ 取反

^~ 但多个匹配同时存在,优先匹配 ^~匹配的内容;不做正则表达式的检查 (优先处理)

location 指令的作用是根据用户请求的URI来执行不同的应用。

不同uri及特殊字符组合匹配的顺序说明

2 location 匹配优先级

2.1 URI匹配的规则与顺序

顺序

不用URI及特殊字符组合匹配

匹配说明

1

location = / {}

精确匹配 /

2

location ^~ /1.tx {

匹配常规字符串,不做正则表达式匹配检查

3

location ~ .(txt|html|php|png)$ {

location ~* .(txt|html|php|png)$ {

正则匹配

区分大小写与不区分大小写

4

location /documents/ {

匹配常规字符串,如果有正则,则优先匹配正则

5

location / {

所有location 都不能匹配后的默认匹配

2.2精确匹配(location = /1.txt)

在server部分使用location配置一个web界面,例如:当访问nginx 服务器的/logo.jpg的时候要显示指定

html文件的内容,精确匹配一般用于匹配组织的logo等相对固定的URL,匹配优先级最高

2.3区分大小写(location ~ .(txt|html|php|png)$

~ 实现区分大小写的模糊匹配. 以下范例中,

如果访问uri中包含大写字母的logo.PNG,则以下location匹配logo.png条件不成功

因为 ~ 区分大小写,当用户的请求被执行匹配时发现location中定义的是小写的png,

本次访问的uri匹配失败,后续要么继续往下匹配其他的location(如果有),要么报错给客户端

2.4不区分大小写(location ~* .(txt|html|php|png)$

~* 用来对用户请求的uri做模糊匹配,uri中无论都是大写、都是小写或者大小写混合,此模式也都会匹 配,通常使用此模式匹配用户request中的静态资源并继续做下一步操作,此方式使用较多

注意: 此方式中,对于Linux文件系统上的文件仍然是区分大小写的,如果磁盘文件不存在,仍会提示404

3 URI优先级匹配案例

3.1 几种方式测试文件匹配优先级

3.1.1 测试location 的访问(同一个文件名不相同的目录)
#  这里没有增加 location /documents/ 是由于他比较特殊 



echo this is 1 > /webdata/nginx/web1/1.txt
echo this is 2 > /webdata/nginx/web2/1.txt
echo this is 3 > /webdata/nginx/web3/1.txt
echo this is 4 > /webdata/nginx/web4/1.txt
echo this is 5 > /webdata/nginx/web5/1.txt

mkdir -p /webdata/nginx/web{1..5}

[root@RHEL-9 conf.d]# vim /usr/local/nginx/conf.d/location02.conf 
server {
    listen 80;
    index index.html;
    server_name www.shuyan.com;
    location / {
          root /webdata/nginx/web1;
    }

    location = /1.txt {
          root /webdata/nginx/web2;
    }

    location ~ .(txt|html|php|png)$ {
          root /webdata/nginx/web3;

    }

    location ^~ /1.t {
          root /webdata/nginx/web4;
    }

}
3.1.2 测试结果

3.1.3 location /documents 存在的特殊性

在配置文件中同时存在 location ^~ /1 和 location /1.txt 匹配规则的时候,location ^~ /1 的优先度会降低,甚至于优先度只比 / 大

3.1.4 总结文件匹配测试

得出结论 在没有location /1.txt 干扰的时候优先级从高到低为 = ^~ (|*) /

在有 location /1.txt 的时候location ^~ /1 的优先级会降低从高到低为 =(|*)/1.txt^~/

3.2 几种方式测试目录匹配优先级

3.2.1 同一文件名不同目录 且 匹配规则是目录

其实在匹配目录的时候也是一样的^~ /t 和 /test 会发生冲突

[root@RHEL-9 conf.d]# vim /usr/local/nginx/conf.d/location02.conf 
server {
    listen 80;
    index index.html;
    server_name www.shuyan.com;  
  
    location ^~ /t {
          root /data/web1;
    }

    location ~* test {
          root /data/web2;
    }

    location /test {
          root /data/web3;
    }

    location / {
          root /data/web4;
    }

}
3.2.2 创建目录与index.html 文件
mkdir -p /data/web{1..5}/test
echo web1 > /data/web1/test/index.html
echo web2 > /data/web2/test/index.html
echo web3 > /data/web3/test/index.html
echo web4 > /data/web4/test/index.html
echo web5 > /data/web5/test/index.html

# 重启服务
[root@RHEL-9 ~]# systemctl restart nginx
3.3.3 实现效果

3.3.4 总结目录匹配

^~ /t 和同时出现/test 会发生冲突

只演示一个效果与以上的文件匹配的是一样的

<think>好的,我现在需要详细回答用户关于Nginxlocation匹配优先级的问题。根据用户提供的引用资料,我需要整理出一个清晰的结构,确保覆盖所有相关规则,并正确引用来源。 首先,用户引用了三篇资料,其中提到了不同的匹配符及其优先级顺序。我需要将这些信息整合成一个优先级列表,从高到低排列。比如,精准匹配(=)优先级最高,其次是前缀匹配(^~),然后是正则匹配(区分大小写的~和不区分的~*),最后是通用匹配(/)。同时要注意,多个正则匹配时按配置顺序生效,而通用匹配作为默认处理。 接下来,我需要解释每个匹配符的具体用法和例子,确保用户能够理解不同情况下的匹配过程。例如,精准匹配只适用于完全相同的URI,而前缀匹配则会检查以指定字符串开头的URI。对于正则表达式匹配,需要强调区分大小写和不区分大小写的区别,以及它们在配置中的顺序重要性。 然后,我需要提供配置示例来说明优先级如何实际应用。比如,当同时存在多个location块时,Nginx如何根据URI选择正确的匹配项。这里可以引用用户提供的示例,说明不同请求路径如何被不同的location块处理,并指出每个结果的依据。 此外,用户可能容易混淆的地方需要特别说明,比如前缀匹配和正则匹配优先级关系,以及正则匹配之间的顺序影响。这有助于避免常见的配置错误。 最后,按照用户的要求生成相关问题,这些问题应该涵盖配置优化、常见错误和应用场景,帮助用户进一步理解和应用所学知识。 整个过程中,需要确保使用正确的中文表达,遵循LaTeX格式要求,正确引用每个知识点对应的来源,并在末尾添加相关问题。同时,保持回答结构清晰,分点说明,让用户能够逐步理解location优先级规则。</think>### Nginx Location匹配优先级规则详解 Nginx的`location`指令用于定义请求URI的匹配规则,其优先级规则直接影响请求路由的准确性。以下是具体优先级顺序和匹配逻辑: --- #### 一、优先级等级(从高到低) 1. **精准匹配 `=`** 优先级最高,仅当请求URI**完全等于**指定字符串时生效。 示例: ```nginx location = /test { ... } # 仅匹配URI为/test的请求 ``` 2. **前缀匹配 `^~`** 匹配以**指定字符串开头**的URI。若匹配成功,**停止后续正则匹配**,直接执行此规则[^1]。 示例: ```nginx location ^~ /static { ... } # 匹配/static、/static/img等 ``` 3. **正则匹配 `~`(区分大小写)** 按配置文件中的**书写顺序**匹配正则表达式,先匹配到的规则生效[^2]。 示例: ```nginx location ~ \.php$ { ... } # 匹配以.php结尾的URI(区分大小写) ``` 4. **正则匹配 `~*`(不区分大小写)** 同上,但忽略大小写。与`~`同级别,按配置顺序判断优先级。 示例: ```nginx location ~* \.jpg$ { ... } # 匹配.jpg、.JPG等 ``` 5. **通用匹配 `/`** 最低优先级,作为默认规则处理未匹配的请求,类似于`switch-case`的`default`分支[^3]。 示例: ```nginx location / { ... } # 匹配所有请求 ``` --- #### 二、匹配逻辑流程图 ```plaintext 请求URI → 检查精准匹配 → 命中则执行 ↓ 未命中 检查前缀匹配 → 命中则停止搜索 ↓ 未命中 按顺序检查正则匹配 → 命中则执行 ↓ 未命中 执行通用匹配 ``` --- #### 三、配置示例与验证 ```nginx server { listen 80; server_name example.com; # 规则1: 精准匹配 location = /login { return 200 "精准匹配生效"; } # 规则2: 前缀匹配 location ^~ /static { return 200 "前缀匹配生效"; } # 规则3: 正则匹配(区分大小写) location ~ \.php$ { return 200 "正则匹配生效(区分大小写)"; } # 规则4: 通用匹配 location / { return 200 "通用匹配生效"; } } ``` **验证结果:** - 请求 `/login` → 返回“精准匹配生效”(规则1)。 - 请求 `/static/logo.png` → 返回“前缀匹配生效”(规则2)。 - 请求 `/index.php` → 返回“正则匹配生效”(规则3)。 - 请求 `/about` → 返回“通用匹配生效”(规则4)。 --- #### 四、常见误区说明 1. **前缀匹配与正则匹配优先级** 即使正则表达式更具体(如`location ~ /static/img`),若已存在`location ^~ /static`,则优先执行前缀匹配[^1]。 2. **正则匹配的顺序敏感性** 若同时存在`location ~ \.png$`和`location ~ \.jpg$`,先定义的规则优先级更高。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值