06-Location详解之精准匹配
之前nginx不是编译过吗?现在重新make install一下。
刚刚这个是我们新安装的、原始版的nginx,配置文件比较少,便于我们做调试。
试试精准匹配的概念。
匹配的是/。优先匹配这个最精准的,一旦匹配完成就立即停止这个匹配过程。
为了以示区别,我把它弄到别的目录上去。
应该是谁发生效果呢?按照官方的说法,等于号是精准匹配。
应该是精准的生效。但是好像出错了。
如果是精准匹配生效访问192.168.118.128应该是显示
<html>
welcome to z.com's admin panel
</html>
到底生没生效,不能说它没生效,只是说没看到应有的效果。
重启nginx服务还是没生效
精准似乎是没生效,还是指向了下面的location。
再修改一下nginx.conf,改成index.htm靠前。
你要说它没生效吧,咱一改它还真有变化。这不就说明它有效果吗?
这是一个容易犯错的思维误区。
查看错误日志
报错是因为:"/usr/local/nginx/html/favicon.ico" failed (2: No such file or directory),找不到/usr/local/nginx/html
但是我们改动精准匹配它也发挥效果了,但是找又跑去第二个location去找。这是什么原因呢?
192.168.118.128这是一个主机名,是一个IP,最终你要访问的肯定是某一个文件/目录。有一个index在发挥作用,所以你不敲具体的文件名,你只敲index的时候,就是只敲一个斜线/的时候,它将会默认把这个请求:192.168.118.128/或者是192.168.118.128/index理解成这个请求:192.168.118.128/index.htm
它就内部给你转发到了这个请求上了。
其实它是发生了这样一个过程:
先是精准匹配,匹配到了/,但是/只是一个目录,它无法给你直接回应。因此它内部再给你转到index.htm。为什么转到index.htm?因为你这内部设置的是index.htm。它内部给你转到index.htm的时候,你的URL再次请求的时候:.128/index.htm给你拿到配置文件去匹配谁能匹配上,精准就匹配不上了。所以这个时候就第二个location能匹配上了。所以这个过程并没有发生任何的错误,看起来好像错了一样,但是实际上是正常的。为什么是正常的?恰恰说明先是发生了精准匹配,精准匹配发生效果了。我们把index.htm改到index.html前面的时候精准匹配给我们转发到了192.168.118.128/index.htm。这个htm它内部又发生了一次请求,location来到了第二个,再次解析,一解析来到了/usr/local/html目录下,但是/usr/local/html/目录下没有index.htm,没有那就404了呗。所以说精准匹配发挥了作用。
但是为什么指到了/usr/local/html/这个目录下面404了呢?你只敲一个/算什么?/只是一个目录,它最终得引导到索引页index.htm上面。那index.htm它的uri已经再次命中,也就是说发生了两次location命中。继续来证明。
这次命中的是/var/www/html/index.htm
再次试验:
这个时候想让它出现谁就出现谁了
精准的优先级切切实实体现出来了。刚刚咱们用目录精准匹配它精准不生效反而被后面的覆盖了。
原来是写的不够准。原来你只写到一个目录级别,目录级别它无法响应给你,目录它是一个大盒子。所以它选一个文件反馈给你。一选文件,于是uri就变了。uri一变你的精准就不准了,所以就被底下发挥了作用,所以看起来稀奇古怪,其实一点都不稀奇古怪。
你一敲目录,它首先是拿索引页来响应你的,问题出在这里。现在准到一个文件级别,确实精准就发挥了作用。
现在地址栏写/两个location都匹配不到了。如果你要是在地址栏上敲一个/,和第一个location =/index.htm肯定是不匹配的。和第二个location /index.htm,你无论把location /index.htm当做一个正则表达式还是字符串都不能和单独一条斜线匹配上。那这个时候location到哪里定位去了?
如果没有相应的location对server负责,应该是继承整体的nginx服务器的配置。那就定位到默认的/usr/local/nginx/html/下面。那就是welcome to nginx这些内容。
直接敲IP,uri不就是一条斜线吗?斜线和第一个location没有精准匹配,和第二个location没有正则匹配。
现在直接敲一个根目录/,
干脆root都不要了
精准匹配到第二个location,应该去找index.htm。于是uri就变成192.168.118.128/index.htm。那么192.168.118.128/index.htm又得去匹配一下,匹配到了第一个location的index.htm。这次它就应该响应到第一个location。
把root加回去
root还真不能去掉。因为去掉就没有root选项,于是它继承了nginx全局服务器(nginx服务器总的配置也就是root的配置),又被指到了/usr/local/nginx/目录下。
就算地址栏不加/它也会理解成一条斜线开始的。
现在先精准命中根目录,根目录说应该给你响应index.html,也就是说一敲192.168.118.128/就得到这个uri:192.168.118.128/index.html。接下来肯定命不中第一个location(因为第一个location是用精准匹配的),但是第三个location起码命中了前9个字符index.htm,
它的地址光是一个IP/主机名,它的uri就相当于理解成是从根目录开始,那就相当于被引导192.168.118.128/index.html。
前提是/var/www/html/index.html存在(上一个实验也是同理,文件存在引导才能完成。)
精准匹配和一般匹配的优先级。根目录它内部还是要再次转发的。精准匹配和一般匹配比,要是还有pattern正则表达式的这种情况,那怎么发挥作用呢?
06-Location详解之精准匹配的更多相关文章
- 06 nginx Location详解之精准匹配
一:Location详解之精准匹配 location 语法 location 有”定位”的意思, 根据Uri来进行不同的定位. 在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分, ...
- nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解
nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...
- Django url配置 正则表达式详解 分组命名匹配 命名URL 别名 和URL反向解析 命名空间模式
Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11版本 ...
- nginx之location详解
location有定位的意思,根据uri来进行不同的定位,在虚拟主机中是必不可少的,location可以定位网站的不同部分,定位到不同的处理方式上. location匹配分类 精准匹配 一般匹配 正则 ...
- nginx location详解
Location block 的基本语法形式是: location [=|~|~*|^~|@] pattern { ... } [=|~|~*|^~|@] 被称作 location modifier ...
- nginx中location详解
Location block 的基本语法形式是: location [=|~|~*|^~|@] pattern { ... } [=|~|~*|^~|@] 被称作 location modifier ...
- nginx location详解(三)
location官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#location Syntax: location [ = | ...
- nginx配置文件中的location详解
location 语法:location [=|~|~*|^~] /uri/ { … } 默认:否 上下文:server 这个指令随URL不同而接受不同的结构.你可以配置使用常规字符串和正则表达式.如 ...
- nginx语法之location详解
Location语法优先级排列 匹配符 匹配规则 优先级 = 精确匹配 ^~ 以某个字符串开头 ~ 区分大小写的正则匹配 ~* 不区分大小写的正则匹配 !~ 区分大小写不匹配的正则 !~* 不区分大小 ...
随机推荐
- Windows下修改hosts并且让他立即生效
1.打开hosts所在的目录 Win+R->C:\windows\System32\drivers\etc 2.编辑hosts文件 使用Notepad++或者记事本以管理员身份打开hosts,修 ...
- Java中BIO,NIO,AIO的理解
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解.具体如下: 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7 ...
- Centos 6.3 Realtek Audio Driver Compile
/**************************************************************************** * Centos 6.3 Realtek A ...
- MFC中控制Tips的显示 - lingyun1120
from: http://www.cnblogs.com/lingyun1120/archive/2011/11/09/2243279.html MFC中为ToolTips生成了一个类CToolTi ...
- LOJ2823 「BalticOI 2014 Day 1」三个朋友
题意 给定一个字符串 S,先将字符串 S 复制一次(变成双倍快乐),得到字符串 T,然后在 T 中插入一个字符,得到字符串 U. 给出字符串 U,重新构造出字符串 S. 所有字符串只包含大写英文字母. ...
- Dawn 简单使用
1. install npm install dawn -g 2. create project # 1. Create & Initialize $ dn init -t front # ...
- 73个word使用终极技巧
1.问:Word里边怎样设置每页不同的页眉?如何使不同的章节显示的页眉不同? 答:分节,每节可以设置不同的页眉.文件——页面设置——版式——页眉和页脚——首页不同 2.问:请问Word中怎样让每一章用 ...
- 几大PHP套件
UPUPW:http://www.upupw.net/ PHPStudy:http://www.phpstudy.net/ PHPNow:http://servkit.org/
- 【转】配置Jmeter的自定义参数
配置Jmeter的自定义参数 User Defined Variables 在这个控件中,定义你所需要的参数,如 在对应的需要使用参数的位置,使用${host}替代. 应用场景: 当测试环境变化时,我 ...
- [PYTHON 实作] 算100
问题:编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性.例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100 ...