Nginx之location匹配规则

柳三千

文章最后更新时间:2025年06月12日

前言:

location是根据url传回来的值进行匹配,然后进行相应的定位。在虚拟主机的配置中,是必不可少的。location可以将网站的不同部分,定位到不同的处理方式上。

一、Nginx常用的正则表达式

1、nginx正则表达式的字符含义

字符 含义
. 匹配任意单个字符
^ 行首锚定,用于模式的最左侧
$ 行尾锚定,用于模式的最右侧
* 匹配前面字符任意次(包括0次)
? 0或1次
+ 1次或多次(1次或以上)
\\ 转义符
\\d 只匹配数字
{n} 重复n次
{n,} 至少n次(n次或以上)
{n,m} n到m次
[ ] 定义匹配字符的范围,只匹配一次
[c] 单个字符
[a-z] 匹配任意小写字母
[a-zA-Z0-9] 匹配任意字母和数字
() 表达式的开始和结束位置
a | b 或运算符a|b

2、location常用的匹配规则

规则表达式 规则含义
= 精确匹配
^~ 普通字符匹配,使用前缀匹配,匹配成功则不再匹配其他location
~ 正则匹配,区分大小写
~\* 正则匹配,不区分大小写

二、location匹配规则

url地址:http://xxx.com/test 会取出“/test”的值与 location /who_test.html location 的 ‘/who_test.html’ 值 匹配

1、生成三个文件,内容分别如下:

[root@WEB nginx]# cat test/test.html 
<h1>test.html</h1>


[root@WEB nginx]# cat /home/test/test.html
<html>
<meta charset='UTF-8 '/>
我是正则匹配出来的test
</html>


[root@WEB nginx]# cat /home/tp/123.html 
<h1>/home/tp/123</h1>

2、配置文件如下:

location /test.html{
    root test;    
}

location /who_test.html {
            root   test;
}
         
location /123 {
            root   /home/tp;
}
         
location ~ test {
        root /home/test;
}

3、验证谁生效

结论:正则匹配的值覆盖了一般匹配的值,优先级比一般匹配高

4、把一般匹配修改成精准匹配

location = /test.html{#精准匹配
    root test;    
}

location /who_test.html {
            root   test;
}

location /123 {
            root   /home/tp;
}
 
location ~ test {
    root /home/test;
}

结论:精准匹配优先级大于正则匹配,精准匹配生效

5、多个一般匹配冲突

location /test.ht{
        root test;
}
location /who_test.html {
            root   test;
}
location /test.htm {
            root   /home/tp;
}
location /test.h {
        root /home/test;
}

找不到文件,查看报错路径

[root@WEB nginx]# tail -1 logs/error.log 
2022/09/30 16:17:35 [error] 1684083#0: *58498 open() "/home/tp/test.html" failed (2: No such file or directory), client: 157.122.113.58, server: www.liudx.cn, request: "GET /test.html HTTP/1.1", host: "liudx.cn"

结论:一般匹配中,匹配值最长的生效

总结:location的命中过程

  1. 先判断精准匹配,如果命中,立即返回结果并结束解析过程。
  2. 判断普通命中,如果有多个命中,记录最长的命中结果(注意:记录最长的值但不结束,继续匹配)
  3. 继续判断正则表达式的解析结果,按配置里的正则表达式顺序为准,由上到下开始匹配,一旦匹配成功,立即返回结果,并结束解析过程

延伸分析:

  • 普通命中:顺序无所谓,按命中的长短来确定
  • 正则命中:先命中为准
文章版权声明:除非注明,否则均为柳三千运维录原创文章,转载或复制请以超链接形式并注明出处。

取消
微信二维码
微信二维码
支付宝二维码