常用nginx匹配规则
2023-06-30 20:56:31    0    0    0
junjie
一、介绍 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小写字母的任意一个 ———————————————— 版权声明:本文为CSDN博主「半生痴狂半生颠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/lhuang0813/article/details/122984808 ``` 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 ] } ``` ———————————————— 版权声明:本文为CSDN博主「半生痴狂半生颠」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:`https://blog.csdn.net/lhuang0813/article/details/122984808`

上一篇: datetimepicker用法总结

下一篇: thinkPHP5实现多数据库连接

Table of content