一 location规则

1.1 location语法

基本语法: location [=|~|~*|^~]/uri/{...}
修饰符释义:
  1 =	#表示精确严格匹配,只有请求的url路径与后面的字符串完全相等时,才会命中。同时若这个查询匹配,将停止搜索并立即处理此请求。
2 ~ #表示该规则是使用正则定义的,且区分大小写;
3 ^~ #表示uri以某个常规字符串开头,匹配 URI 路径。且nginx不对url做编码,如请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格);
4 ~* #表示该规则是使用正则定义的,且不区分大小写;
5 / #用户所使用的代理(一般为浏览器);
  1 $http_x_forwarded_for	#通过代理服务器来记录客户端的ip地址;
2 $http_referer #记录用户是从哪个链接访问过来的。

1.2 location匹配过程

对请求的url序列化。例如,对%xx等字符进行解码,去除url中多个相连的/,解析url中的.,..等。这一步是匹配的前置工作。
location有两种表示形式,一种是使用前缀字符,一种是使用带~或~*修饰符的正则。
其相应的匹配过程如下:
  1. 如果找到了精确匹配的location,也就是使用了=修饰符的location,结束查找,使用它的配置。
  2. 所有剩下的常规字符串,采用最长匹配;
  3. 继续判断正则表达式的解析结果,按配置里的正则表达式顺序为准,由上至下开始匹配,一旦匹配成功1个,立即返回结果,并结束解析过程。
  4. 如果第3条规则产生匹配的话,结果被使用。否则,使用第2条规则的结果。
注意:普通命中顺序无所谓,是因为按命中的长短来确定。正则命中,顺序有所谓,因为是从前入往后命中的。

基于以上的匹配过程,我们可以得到以下两点启示:
  1. 使用正则定义的location在配置文件中出现的顺序很重要。因为找到第一个匹配的正则后,查找就停止了,后续定义的匹配(不管精度如何)都不再进行查找。
  2. 使用精确匹配可以提高查找的速度。例如经常请求/的话,可以使用=来定义location。

1.3 location匹配优先级

由location匹配规则可知,其匹配优先级为:(location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/) 。

二 location规则示例

2.1 环境预设

  1 [root@nginx01 ~]# vi /etc/nginx/conf.d/location.conf
2 server {
3 listen 80;
4 server_name location.linuxds.com;
5 access_log /var/log/nginx/location.access.log main;
6 error_log /var/log/nginx/location.error.log warn;
7 location = / {
8 add_header Content-Type text/plain;
9 return 200 'A';
10 # 精确匹配 / ,主机名后面不能带任何字符串
11 }
12 location = /login {
13 add_header Content-Type text/plain;
14 return 200 'B';
15 }
16 location ^~ /static/ {
17 add_header Content-Type text/plain;
18 return 200 'C';
19 # 匹配任何以 /static/ 开头的地址,匹配以后,不在往下检索正则,立即采用这一条。
20 }
21 location ^~ /static/files {
22 add_header Content-Type text/plain;
23 return 200 'D';
24 # 匹配任何以 /static/files 开头的地址,匹配以后,不在往下检索正则,立即采用这一条。
25 }
26 location ~ \.(gif|jpg|png|js|css|txt) {
27 add_header Content-Type text/plain;
28 return 200 'E';
29 }
30 location ~* \.txt$ {
31 add_header Content-Type text/plain;
32 return 200 'F';
33 # 匹配所有以 txt 结尾的请求
34 # 然而,所有请求 /static/ 下的txt会被 规则 C 处理,因为 ^~ 到达不了这一条正则。
35 }
36 location /image {
37 add_header Content-Type text/plain;
38 return 200 'G';
39 # 匹配任何以 /image/ 开头的地址,匹配符合以后,还要继续往下搜索;
40 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条。
41 }
42 location / {
43 add_header Content-Type text/plain;
44 return 200 'H';
45 # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求。
46 # 但是正则和最长字符串会优先匹配。
47 }
48 }
  1 [root@nginx ~]# nginx -t -c /etc/nginx/nginx.conf	#检查配置文件
2 [root@nginx ~]# nginx -s reload #重载配置文件

2.2 匹配测试

访问:http://location.linuxds.com/,将匹配规则A:
访问:http://location.linuxds.com/login,将匹配规则B:
访问:http://location.linuxds.com/static/test.html,将匹配规则C:
访问:http://location.linuxds.com/static/files/test.txt,将匹配规则D:
解释:虽然也符合规则C,但基于最大匹配原则,因此优先选择规则D。
访问:http://location.linuxds.com/test.txt,将匹配规则E:
解释:虽然也符合规则F,但正则中基于顺序优先,因此优先选择规则E。
访问:http://location.linuxds.com/static/test.txt,将匹配规则C:
解释:虽然也符合规则F,但基于匹配优先级^~ > ~,~*,因此优先选择规则C。
访问:http://location.linuxds.com/test.TXT,将匹配规则G:
解释:规则E区分大小写,规则F不区分大小写,因此优先选择规则F。
访问:http://location.linuxds.com/image/test.txt,将匹配规则E:
解释:虽然也符合规则Y,但基于正则匹配优先,因此优选选择规则E。
访问:http://location.linuxds.com/image/test.tiff,将匹配规则G:
解释:没有更高优先级的其他规则(正则或=),因此匹配规则G。
访问:http://location.linuxds.com/work/1234,将匹配规则I:
解释:如上除H之外所有规则都不匹配,所有的地址都以 / 开头,所以这条规则将作为最后匹配规则。
参考:
http://www.zzvips.com/article/33760.html
https://juejin.im/post/5ce5e1f65188254159084141
http://www.zzvips.com/article/33760.html
https://www.nginx.cn/doc/standard/httpcore.html #官方参考

三 正则与判断

参考:https://blog.csdn.net/weixin_33726943/article/details/86007331

附001.Nginx location语法规则的更多相关文章

  1. [nginx]location语法

    location语法 location语法格式 location [=|~|~*|^~] uri { .... } location [=|~|~*|^~] uri {....} 指令 匹配标识 匹配 ...

  2. nginx location语法使用说明

    语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因 ...

  3. Nginx Location 语法,与简单配置[转]

    一、介绍Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”, 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器 ...

  4. Nginx location 匹配规则详解

    语法规则 location [=|~|~*|^~] /uri/ { … } 模式 含义 location = /uri = 表示精确匹配,只有完全匹配上才能生效 location ^~ /uri ^~ ...

  5. nginx Location 语法基础知识

    URL地址匹配是Nginx配置中最灵活的部分 Location 支持正则表达式匹配,也支持条件匹配,用户可以通过location指令实现Nginx对动丶静态网页的过滤处理. Nginx locatio ...

  6. [转载+整理]Nginx Location匹配规则

    目录 规则语法 location 分类 匹配顺序: 扩展 location / {}和 location =/ {}的区别 测试 规则语法 语法 匹配规则 空 普通匹配(遵循最大前缀匹配规则, 优先度 ...

  7. nginx location 语法

    location 语法location 有”定位”的意思, 根据Uri来进行不同的定位.在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分,定位到不同的处理方式上.比如, 碰到.p ...

  8. [整理] Nginx Location 匹配规则

    目录 规则语法 location 分类 匹配顺序: 扩展 location / {}和 location =/ {}的区别 如何快速测试 规则语法 语法 匹配规则 空 普通匹配(遵循最大前缀匹配规则, ...

  9. nginx location匹配规则

    谢谢作者的分享精神,原文地址:http://www.nginx.cn/115.html location匹配命令 ~      #波浪线表示执行一个正则匹配,区分大小写~*    #表示执行一个正则匹 ...

随机推荐

  1. Ueditor富文本添加视频内容,视频不显示以及编辑富文本时,视频不显示解决方案

    问题是在添加视频时,编辑器会把视频标签<video>换成<img>.很讨厌... 1.2是解决添加视频时不显示,3是解决编辑时不显示 ueditor.all.js文件中  第7 ...

  2. SQL注入入门

    这几天做了不少SQL注入题,对SQL注入有点体会,所以写写自己的学习历程与体会. 什么是SQL注入 SQL注入就是指web程序对用户输入的数据的合法性没有进行判断,由前端传入的参数带着攻击者控制的非法 ...

  3. 入门大数据---Elasticsearch搭建与应用

    项目版本 构建需要: JDK1.7 Elasticsearch2.2.1 junit4.10 log4j1.2.17 spring-context3.2.0.RELEASE spring-core3. ...

  4. Android studio 使用夜神模拟器

    首先参考这个:http://blog.csdn.net/jssongwei/article/details/50771441 然后我发现就是一个端口问题

  5. node+ajax实战案例(5)

    6.添加客户 6.1.点击添加按钮,弹出表单框 // 添加用户 显示对话框 var addBtn = document.getElementById('add-btn'); var addUser = ...

  6. 《UNIX环境高级编程》(APUE) 笔记第七章 - 进程环境

    7 - 进程环境 Github 地址 1. main 函数 C 程序总是从 main 函数 开始执行: int main(int argc, char *argv[]); \(argc\) 为命令行参 ...

  7. 洛谷 P2648 赚钱

    这道题其实就是求最长路顺便再判断一下正环而已. 这种题肯定要用SPFA的啦,有又正边权(因为最长路所以正边就相当于负边),又是正环(同理,相当于负环),SPFA专治这种问题. 当一个点入队多次的时候, ...

  8. 在 Spring Boot 中,如何干掉 if else!

    需求 传统实现 策略模式实现 ClassScanner:扫描工具类源码 总结 需求 这里虚拟一个业务需求,让大家容易理解.假设有一个订单系统,里面的一个功能是根据订单的不同类型作出不同的处理. 订单实 ...

  9. 线程的创建方式以及synchronize的使用

    线程的两种创建方式 继承 Thread class Thr extends Thread {    @Override    public void run() {        Thread.cur ...

  10. Drozer简单使用

    1.Drozer简介   Drozer是一款针对Android系统的安全测试框架.Drozer可以通过与dalivik VM交互.与其他应用程序的IPC端点交互.与底层操作系统的交互,来避免正处于开发 ...