写点什么

Nginx 详解 Location 匹配规则

作者:Java高工P7
  • 2021 年 11 月 11 日
  • 本文字数:1476 字

    阅读完需:约 5 分钟

URI 匹配模式


======================================================================


location 的指令分为两种匹配模式


1.普通字符串匹配: 以=开头或者没有带正则引导符号(~)规则


2.正则匹配:以()开头或者(*)开头的表示正则匹配


普通匹配模式




location / {


root html;


index index.html index.htm;


}


location /demo {


root html;


index demo.html;


}


1.配置两个 location, 第一个是匹配根路径”/”, 另一个是匹配 “/demo”路径


2.在 html 目录下创建一个 demo 目录, 因为/demo 相当于是一个虚拟主机目录,最终访问的地址会变成/demo/demo.html


3.重新加载配置文件’./nginx -s reload’


4.通过在浏览器中输入 http://localhost/ 以及 http://localhost/demo 可以看到我们访问到了对应的路径


匹配规则:


location 不是严格匹配,而是一个“前缀匹配”过程,所以在上面那个案例中,两个 location 都能够匹配,但是普通匹配会遵循一个最长匹配规则,也就是上面的请求中,最终 uri 会匹配到长度最大 location。也就是/demo


精准匹配模式




在普通匹配模式中,还可以细分出一种叫精准匹配模式,也就是通过等于号直接来匹配的


location =/demo {


root html;


index gp.html;


}


location /demo {


root html;


index demo.html;


}


我们继续沿着上面的案例来添加一个基于 location =/demo 的匹配规则,那么这个时候的匹配就是精准匹配。精准匹配和普通匹配的差异在哪里呢?以及匹配顺序是什么样的?


http://localhost/demo √


http://localhost/demo/demo.html √


http://localhost/demo/gp.html √ (精准匹配)


但是在此处并不能证明此处是精准匹配


#location =/demo {

root html;

index gp.html;

#}


location /demo {


root html;


index demo.html;


}


把精准匹配注释掉


http://localhost/demo √


http://localhost/demo/demo.html √


http://localhost/demo/gp.html √ (普通匹配)


location =/demo {


root html;


index gp.html;


}


#location /demo {

root html;

index demo.html;

#}


我们把普通匹配注释掉发现:


http://localhost/demo ×


http://localhost/demo/demo.html √


http://localhost/demo/gp.html √


第一种方式访问不了。但这也证明不了精准匹配的优先级比普通匹配高,这时我们可以这样设置


location =/index.html { # 精准匹配


root html/gp1;


index index.html;


}


location /index.html { # 普通匹配


root html/gp2;


index index.html;


}


然后我们再访问



访问到的是 gp1 目录中的,说明普通匹配没起作用。


正则匹配模式




正则匹配在实际应用中也会用得比较多,比如接下来给大家演示一个基于正则匹配的案例


location ~* .(jpg|png|css|js|gif)$ {


root html/images;


}


然后我们在 html 目录下创建 images 文件夹,里面放入一张图片。Reload nginx 服务后,访问



正则匹配在三种匹配模式中的优先级是什么样的呢?前面我们讲了一般匹配,最终会选择最大前缀匹配。但是匹配后不会停止匹配,最大匹配只是一个临时结果,nginx 还需要继续检查正则 location。那么正则匹配规则是什么样的?按照正则 location 在配置文件中的物理顺序匹配。如果匹配到一条正则 location,就不再考虑后面的规则


匹配的优先级




  1. 首先看有没有精准匹配,如果有,则停止匹配过程

  2. 判断普通命中,如果有多个命中,“记录”下最长的命中结果(记录但不结束)

  3. 继续判断正则表达式,按配置里的正则表达式顺序为准,由上到下开始匹配,一旦匹配成功一个,立即返回结果并结束


a) 普通命中,顺序无关,因为按照


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


命中长短来确定


b) 正则命中,顺序有关系,因为是从前往后命中

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Nginx详解Location匹配规则