nginx匹配规则详解
一、介绍
location指令是http模块当中最核心的一项配置,根据预先定义的URL匹配规则来接收用户发送的请求,根据匹配结果,将请求转发到后台服务器、非法的请求直接拒绝并返回403、404、500错误处理等。本文结合语法、优先级、匹配规则做描述。
二、location指令语法
location [=|~|~*|^~|@] /uri/ { … } 或 location @name { … }
location 顺序/优先级:
(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/)
解释说明(下面会有详解):
= 开头表示精确匹配; 如: A 中只匹配根目录结尾的请求,后面不能带任何字符串.
^~ 开头表示uri以某个常规字符串开头,不是正则匹配;
~ 开头表示区分大小写的正则匹配;
~* 开头表示不区分大小写的正则匹配;
/ 通用匹配, 如果没有其它匹配,任何请求都会匹配到;
三、URI匹配模式
location指令分为两种匹配模式:
1> 普通字符串匹配:以=开头或开头无引导字符(~)的规则
2> 正则匹配:以~或~*开头表示正则匹配,~*表示正则不区分大小写
四、location URI匹配规则
当nginx收到一个请求后,会截取请求的URI部份,去搜索所有location指令中定义的URI匹配模式。在server模块中可以定义多个location指令来匹配不同的url请求,多个不同location配置的URI匹配模式,总体的匹配原则是:先匹配普通字符串模式,再匹配正则模式。只识别URI部份,例如请求为:/test/abc/user.do?name=xxxx
一个请求过来后,Nginx匹配这个请求的流程如下:
1> 先查找是否有=开头的精确匹配,如:location = /test/abc/user.do { … }
2> 再查找普通匹配,以 最大前缀 为原则,如有以下两个location,则会匹配后一项
* location /test/ { … }
* location /test/abc { … }
3> 匹配到一个普通格式后,搜索并未结束,而是暂存当前匹配的结果,并继续搜索正则匹配模式
4> 所有正则匹配模式location中找到第一个匹配项后,就以此项为最终匹配结果
所以正则匹配项匹配规则,受定义的前后顺序影响,但普通匹配模式不会
5> 如果未找到正则匹配项,则以3中缓存的结果为最终匹配结果
6> 如果一个匹配都没搜索到,则返回404
五、精确匹配与模糊匹配差别
location =/ { … } 与 location / { … } 的差别:
* 前一个是精确匹配,只响应/请求,所有/xxx或/xxx/xxxx类的请求都不会以前缀的形式匹配到它
* 后一个是只要以 / 为前缀的请求都会被匹配到。如:/abc , /test/abc, /test/abc/aaaa
实际例子后缀区分:
假设nginx中的配置是:
server {listen 80;server_name x.x.x.x;......location /subdir {proxy_pass http://y.y.y.y; ###注意这里没有以/结尾}}
那么用户请求http://x.x.x.x/subdir/other时,匹配到该区块,nginx反代会保留虚拟路径,nginx实际
转发后端的请求URL为http://http://x.x.x.x/subdir/other
假如配置为:
server {listen 80;server_name x.x.x.x;......location /subdir {proxy_pass http://y.y.y.y/; ##注意这里以/结尾}}
那么用户请求http://x.x.x.x/subdir/other时,匹配到该区块,nginx反代不会保留虚拟路径,nginx实际
转发后端的请求URL为http://http://x.x.x.x//other
六、正则与非正则匹配
1> location ~ /test/.+.jsp$ { … } :正则匹配,支持标准的正则表达式语法。
2> location ^~ / { … } : ^~意思是关闭正则匹配,当搜索到这个普通匹配模式后,将不再继续搜索正则匹配模式。
常用正则
- . : 匹配除换行符以外的任意字符
- ? : 重复0次或1次
- + : 重复1次或更多次
- * : 重复0次或更多次
- \d :匹配数字
- ^ : 匹配字符串的开始
- $ : 匹配字符串的介绍
- {n} : 重复n次
- {n,} : 重复n次或更多次
- [c] : 匹配单个字符c
- [^/] : 匹配除了/之外的所有字符
- [a-z] : 匹配a-z小写字母的任意一个
下面看一些实际例子:
location = / {# 精确匹配 / ,主机名后面不能带任何字符串[ configuration A ]
}
location / {# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求# 但是正则和最长字符串会优先匹配[ configuration B ]
}
location /documents/ {# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条[ configuration C ]
}
location ~ /documents/Abc {# 匹配任何以 /documents/Abc 开头的地址,匹配符合以后,还要继续往下搜索# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条[ configuration CC ]
}
location ^~ /images/ {# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {# 匹配所有以 gif,jpg或jpeg 结尾的请求# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则[ configuration E ]
}
location /images/ {# 字符匹配到 /images/,继续往下,会发现 ^~ 存在[ configuration F ]
}
location /images/abc {# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在# F与G的放置顺序是没有关系的[ configuration G ]
}
location ~ /images/abc/ {# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用[ configuration H ]
}
location ~* /js/.*/\.js {# 不区分大小写匹配[ configuration I ]
}
nginx匹配规则详解相关推荐
- 运维之道 | Nginx rewrite 规则详解
Nginx rewrite 规则详解 一.rewrite规则概念 rewirte 规则也称为规则重写,主要功能是实现浏览器访问 HTTP URL 的跳转,其正则表达式是基于 Perl 语言.通常而言, ...
- Nginx rewrite 规则详解
Nginx rewrite规则详解 rewire规则也称为规则重写,主要功能是实现浏览器访问 Http Uri的跳转,其正则表达式是基于Perl语言.通常而言,几乎所有的Web服务器均可以支持URL重 ...
- java正则匹配多个斜杠_正则表达式中两个反斜杠的匹配规则详解
关于正则表达式raw的\匹配规则 这是我在学习中获得到的一个例子,第一表达式中匹配到的是none.于是乎我就在思考,为什么会匹配不到,假设\t被转义成一个\t,那么也应该匹配到\tsanle,而不是n ...
- Nginx之location 匹配规则详解
Nginx 的语法形式是: location [=|~|~*|^~|@] /uri/ { - } ,意思是可以以" = "或" ~* "或" ~ &q ...
- nginx配置中location匹配规则详解
女主宣言 nginx作为一款性能优异的反向代理服务器,可以用于静态代理.负载均衡.限流等多种场景.那么,要灵活的使用nginx,必须清楚nginx配置文件的使用.本文作者对nginx的http块中的l ...
- nginx rewrite规则详解
Nginx Rewrite Rewrite Rewrite介绍 nginx通过ngx_http_rewrite_module模块支持url重写.支持if条件判断,但不支持else.另外该模块需要PCR ...
- Nginx正则表达式之匹配操作符详解
2019独角兽企业重金招聘Python工程师标准>>> Nginx正则表达式之匹配操作符详解 nginx可以在配置文件中对某些内置变量进行判断,从而实现某些功能.例如:防止rewri ...
- Nginx之location详解
root location中root指定的只是相对路径,需要和路径结合起来映射地址,比如 location ^~/static/ { ## 这里的root需要和路径结合使用,即是映射的文件位置为 /u ...
- nginx的配置文件详解
文章目录 1. nginx的配置文件详解 2. nginx.conf配置详解 3. 用于调试.定位问题的配置参数 4. 正常运行必备的配置参数 5. 优化性能的配置参数 6. 事件相关的配置:even ...
- location ~ .php$,nginx location指令详解,
nginx location指令详解, location匹配的是nginx的哪个变量? $request_uri location的匹配种类有哪些? =开头表示精确匹配 ^~ 开头,注意这不是一个正则 ...
最新文章
- libpcap捕包机制分析(三)
- rabbitMQ简单使用
- python时间模块哪个好arrow模块_python库: arrow (时间)
- Hbase(1)——基础语句(1)
- 十五、CSS 3新特性详解(三)——3D转换(位移、旋转、呈现)、透视perspective、旋转rotateX、Y、Z、呈现transform-style
- jqgrid下treegrid排序问题
- Day_2_Python_str_list_dict的使用
- Perl中删除或替换字符串中特殊字符(如空格)的方法
- 如何将zipoutputstream返回_嫦娥五号返回器要“跳”一下再回地球!这一“跳”大有讲究...
- 巴什博弈:取石子游戏
- [JNI]开发之旅 (3)jni域描述符说明
- win8普通版连接远程桌面---RDPWrap
- 开源网络情报系统释放数据黄金价值
- R语言和Julia以及Python使用Feather包共享数据
- 天堂里有没有车来车往
- Dlink路由器后门分析
- iOS设备分辨率 UI规范 以及适配
- 解决STM8S103K3T6打开BEEP功能遇到的无法操作BEEP_CSR的问题
- 简单的身份证号码,全面填写,可以比较年份、月份、天数(初学者学习可以看看)
- Pycharm下载MaxCompute过程
热门文章
- html调用wmp,web页面中嵌入window media player,支持IE和Chrome
- bugku 杂项 QAQ
- 色拉英语第2集第4幕: Cheers! ….hiccup
- 网关冗余技术、链路冗余技术 、 ACL原理、ACL配置
- 清华大学两名博士生被开除:你不吃学习的苦,就要吃生活的苦
- h2o api java_h2o H2OAutoEncoderEstimator
- LOMO效果的PS Action
- 高山大学2019级学员名单:但斌、王高飞、胡玮炜等入选
- 玩转华为ENSP模拟器系列 | 通过STelnet登录其他设备举例(DSA)
- Windows 2008 R2 终端服务器授权安装配置