一、介绍

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匹配规则详解相关推荐

  1. 运维之道 | Nginx rewrite 规则详解

    Nginx rewrite 规则详解 一.rewrite规则概念 rewirte 规则也称为规则重写,主要功能是实现浏览器访问 HTTP URL 的跳转,其正则表达式是基于 Perl 语言.通常而言, ...

  2. Nginx rewrite 规则详解

    Nginx rewrite规则详解 rewire规则也称为规则重写,主要功能是实现浏览器访问 Http Uri的跳转,其正则表达式是基于Perl语言.通常而言,几乎所有的Web服务器均可以支持URL重 ...

  3. java正则匹配多个斜杠_正则表达式中两个反斜杠的匹配规则详解

    关于正则表达式raw的\匹配规则 这是我在学习中获得到的一个例子,第一表达式中匹配到的是none.于是乎我就在思考,为什么会匹配不到,假设\t被转义成一个\t,那么也应该匹配到\tsanle,而不是n ...

  4. Nginx之location 匹配规则详解

    Nginx 的语法形式是: location [=|~|~*|^~|@] /uri/ { - } ,意思是可以以" = "或" ~* "或" ~ &q ...

  5. nginx配置中location匹配规则详解

    女主宣言 nginx作为一款性能优异的反向代理服务器,可以用于静态代理.负载均衡.限流等多种场景.那么,要灵活的使用nginx,必须清楚nginx配置文件的使用.本文作者对nginx的http块中的l ...

  6. nginx rewrite规则详解

    Nginx Rewrite Rewrite Rewrite介绍 nginx通过ngx_http_rewrite_module模块支持url重写.支持if条件判断,但不支持else.另外该模块需要PCR ...

  7. Nginx正则表达式之匹配操作符详解

    2019独角兽企业重金招聘Python工程师标准>>> Nginx正则表达式之匹配操作符详解 nginx可以在配置文件中对某些内置变量进行判断,从而实现某些功能.例如:防止rewri ...

  8. Nginx之location详解

    root location中root指定的只是相对路径,需要和路径结合起来映射地址,比如 location ^~/static/ { ## 这里的root需要和路径结合使用,即是映射的文件位置为 /u ...

  9. nginx的配置文件详解

    文章目录 1. nginx的配置文件详解 2. nginx.conf配置详解 3. 用于调试.定位问题的配置参数 4. 正常运行必备的配置参数 5. 优化性能的配置参数 6. 事件相关的配置:even ...

  10. location ~ .php$,nginx location指令详解,

    nginx location指令详解, location匹配的是nginx的哪个变量? $request_uri location的匹配种类有哪些? =开头表示精确匹配 ^~ 开头,注意这不是一个正则 ...

最新文章

  1. libpcap捕包机制分析(三)
  2. rabbitMQ简单使用
  3. python时间模块哪个好arrow模块_python库: arrow (时间)
  4. Hbase(1)——基础语句(1)
  5. 十五、CSS 3新特性详解(三)——3D转换(位移、旋转、呈现)、透视perspective、旋转rotateX、Y、Z、呈现transform-style
  6. jqgrid下treegrid排序问题
  7. Day_2_Python_str_list_dict的使用
  8. Perl中删除或替换字符串中特殊字符(如空格)的方法
  9. 如何将zipoutputstream返回_嫦娥五号返回器要“跳”一下再回地球!这一“跳”大有讲究...
  10. 巴什博弈:取石子游戏
  11. [JNI]开发之旅 (3)jni域描述符说明
  12. win8普通版连接远程桌面---RDPWrap
  13. 开源网络情报系统释放数据黄金价值
  14. R语言和Julia以及Python使用Feather包共享数据
  15. 天堂里有没有车来车往
  16. Dlink路由器后门分析
  17. iOS设备分辨率 UI规范 以及适配
  18. 解决STM8S103K3T6打开BEEP功能遇到的无法操作BEEP_CSR的问题
  19. 简单的身份证号码,全面填写,可以比较年份、月份、天数(初学者学习可以看看)
  20. Pycharm下载MaxCompute过程

热门文章

  1. html调用wmp,web页面中嵌入window media player,支持IE和Chrome
  2. bugku 杂项 QAQ
  3. 色拉英语第2集第4幕: Cheers! ….hiccup
  4. 网关冗余技术、链路冗余技术 、 ACL原理、ACL配置
  5. 清华大学两名博士生被开除:你不吃学习的苦,就要吃生活的苦
  6. h2o api java_h2o H2OAutoEncoderEstimator
  7. LOMO效果的PS Action
  8. 高山大学2019级学员名单:但斌、王高飞、胡玮炜等入选
  9. 玩转华为ENSP模拟器系列 | 通过STelnet登录其他设备举例(DSA)
  10. Windows 2008 R2 终端服务器授权安装配置