Nginx 匹配流程一览
在 nginx server 模块中,location 的定义长被用来匹配一个标准的 URI, 并根据 URI 的不同做出相应的服务方案。
nginx location 匹配的优先级
在 location 中,共有 5 种匹配的模式:
种类 | 写法 |
---|---|
none | location 中没有指定任何的匹配模式, 会以前缀的方式进行匹配,不会停止搜索,会继续匹配下一个 location 的内容。 |
= |
location 中需要准确匹配 = 后面配置的内容,如果匹配成功,就停止搜索。 |
~ |
会以大小写敏感的方式来匹配 location 中的内容。 |
~* |
会以大小写不敏感的方式来匹配 location 中的内容。 |
^~ |
如果以非正则的方式,找到了最佳的匹配内容,会停止到这,不再搜索可能存在的正则匹配 。 |
在看完这五种默认的匹配后,可能还是觉得不太容易理解, 下面会以 Nginx 的视角来模拟匹配的过程。
对于每一个请求来说,Nginx 会在配置的多个 location 块中,选取最合适的一个配置块来提供客户端的响应。而为了找到最优的选择,在每一个请求来时,会执行如下的流程:
- Nginx 首先会进行准确的匹配,如果在 location 的配置中找到和
=
后配置相同的内容,就会立即选择这个 location 的配置作为请求的服务端。 - 如果没有以
=
开始的 location 块,Nginx 会开始搜索能够匹配前缀的 location 配置块,并选择匹配最长前缀的 location 进行判断:- 如果最长匹配的 location 中包含
^~
,Nginx 就会停止搜索,选择这个 location 提供服务。 - 如果最长匹配中 location 不包含
^~
, 也就是 none 的类型,Nginx 会将当前作为临时的参考,继续向下搜索。
- 如果最长匹配的 location 中包含
- 接着 Nginx 会将 URL 和大小写敏感,大小写不敏感的正则进行匹配。如果匹配成功,就会选择当前的正则 location 配置提供服务。
- 如果没有匹配到任何的正则配置块,就会选择第二步中,作为临时参考保存的配置块进行服务。
简单来说,匹配的优先级就是:=
> ^~
> ~
> ~*
> none
匹配过程具体举例:
假设对 Nginx location 进行了如下的配置:
location = / {
[ configuration A ]
}
location / {
[ configuration B ]
}
location /documents/ {
[ configuration C ]
}
location ^~ /images/ {
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
[ configuration E ]
}
/ 会匹配到 configuration A ,因为
=
是搜索的第一位,也具有最高的优先级。/images/1.gif 会匹配到 configuration D 。
首先=
代表的配置块没有匹配成功,会开始进行前缀最长匹配,这时发现 D 满足,且 D 是^~
类型,进而选择 D 。/documents/1.jpg 会匹配到 configuration E 。
同样=
代表的配置块没有匹配成功,会开始进行最长前缀匹配,这时发现 E 满足,但 E 并不是^~
类型,因此作为临时方案,继续向下匹配。发现 E 是正则匹配,且能匹配成功,就此结束选择 E 。/index.html 会匹配到 configuration B 的配置块。
一样的=
代表的配置块匹配失败,会开始进行最长前缀匹配,这时发现 B 满足,但 B 并不是^~
类型,临时保存,继续匹配。发现并不能找到合适的正则匹配。因此托底方案 B 被选择。
参考
Nginx 匹配流程一览的更多相关文章
- django的url匹配流程
URL匹配流程(路由解析顺序): URL匹配流程说明 域名.端口.端口后的 /,以及查询字符串(问号后面的键值参数)不参与匹配 先到项目下的 urls.py 进行匹配,再到应用的 urls.py 匹配 ...
- 菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程
菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程 Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...
- Nginx核心流程及模块介绍
Nginx核心流程及模块介绍 1. Nginx简介以及特点 Nginx简介: Nginx (engine x) 是一个高性能的web服务器和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 ...
- Docker+Nginx使用流程(笔记)
Docker+Nginx使用流程 本教程依据个人理解并经过实际验证为正确,特此记录下来,权当笔记. 注:基于linux操作系统 # uname -r 查看你当前的内核版本 # yum -y insta ...
- Nginx请求处理流程
因为 Nginx 运行在企业内网的最外层也就是边缘节点,那么他处理的的流量是其他应用服务器处理流量的数倍,甚至几个数量级,我们知道任何一种问题在不同的数量级下,他的解决方案是完全不同的,所以在 Ngi ...
- 一个nginx匹配很诡异的问题
nginx配置如下: location ~ \.php$ { root /opt/nginx/html; fastcgi_pass 127.0.0.1:9000; fastcgi_index inde ...
- nginx 匹配.zip .apk 结尾的文件 直接下载
server { listen 80; server_name ok.xidd.com; index index.html index.htm index.php; root /alidata/www ...
- 从 mian 函数开始一步一步分析 nginx 执行流程(二)
如不做特殊说明,本博客所使用的 nginx 源码版本是 1.0.14,[] 中是代码所在的文件! 上一个博客中我们将 main 函数执行流程分析完,到最后一步调用 ngx_master_process ...
- 从 mian 函数开始一步一步分析 nginx 执行流程(一)
如不做特殊说明,本博客所使用的 nginx 源码版本是 1.0.14,[] 中是代码所在的文件! 我们先贴出 main 函数的部分代码: [core/nginx.c] int ngx_cdecl ma ...
随机推荐
- docker2-容器的使用
[root@ipha-dev71- chenjl]# docker [root@ipha-dev71- chenjl]# docker pull training/webapp [root@ipha- ...
- unittest-A接口的返回结果作为B接口的入参(设置全局变量)
在A接口用例中设置全局变量: globals()["a"] = "用例A的返回结果" 在B接口用例中使用全局变量: b = globals()["a& ...
- 元组/字典/集合内置方法+简单哈希表(day07整理)
目录 二十三.元组内置方法 二十四.字典数据类型 二十五 集合内置方法 二十五.数据类型总结 二十六.深浅拷贝 补充:散列表(哈希表) 二十三.元组内置方法 什么是元组:只可取,不可更改的列表 作用: ...
- OptimalSolution(9)--其他问题(2)
一.有关阶乘的两个问题 二.最大的leftMax与rightMax之差的绝对值 三.路径数组变为统计数组 四.一种字符串和数字的对应关系 五.1到n中1出现的次数 六.数字的英文表达和中文表达 七.分 ...
- vueclass
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Blazor之ABC
.net core正式推出了Blazor, 正好在一个小项目里试用一下. 建立项目 因为基于WebAssemble的客户端Blazor还不是正式版, 为了避免不必要的麻烦,我试用服务端的Blazor. ...
- ArcGIS Engine制作DIY地图工具
本节将向你介绍,利用ToolStrip制作自定义GIS工具条. 步骤如下: ①向ToolStrip中添加一个Button ②向该Button的lmg属性添加图片素材,并将Button的图片比例(Ima ...
- 【Leetcode 做题学算法周刊】第二期
首发于微信公众号<前端成长记>,写于 2019.11.05 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 20 ...
- Android H5混合开发(2):自定义Cordova插件
前言 Cordova虽然定义了很多基础的插件,供H5端使用原生设备的功能. 但是,如果业务相关的功能,需要提供给H5端使用,那么,就需要我们自定义插件了. 这个"自定义"不是指由A ...
- 面经-科大讯飞AI研究院
面试时间:2019.06.27 电话面试 面试岗位:计算机视觉算法工程师/一面 面试时长:45分钟 面试内容: 自我介绍 简历中选择一个项目介绍-视频召回 问及项目中的语音.人脸.标题.模态缺失相关细 ...