之前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详解之精准匹配的更多相关文章

  1. 06 nginx Location详解之精准匹配

    一:Location详解之精准匹配 location 语法 location 有”定位”的意思, 根据Uri来进行不同的定位. 在虚拟主机的配置中,是必不可少的,location可以把网站的不同部分, ...

  2. nginx入门与实战 安装 启动 配置nginx Nginx状态信息(status)配置 正向代理 反向代理 nginx语法之location详解

    nginx入门与实战 网站服务 想必我们大多数人都是通过访问网站而开始接触互联网的吧.我们平时访问的网站服务 就是 Web 网络服务,一般是指允许用户通过浏览器访问到互联网中各种资源的服务. Web ...

  3. Django url配置 正则表达式详解 分组命名匹配 命名URL 别名 和URL反向解析 命名空间模式

    Django基础二之URL路由系统 本节目录 一 URL配置 二 正则表达式详解 三 分组命名匹配 四 命名URL(别名)和URL反向解析 五 命名空间模式 一 URL配置 Django 1.11版本 ...

  4. nginx之location详解

    location有定位的意思,根据uri来进行不同的定位,在虚拟主机中是必不可少的,location可以定位网站的不同部分,定位到不同的处理方式上. location匹配分类 精准匹配 一般匹配 正则 ...

  5. nginx location详解

    Location block 的基本语法形式是: location [=|~|~*|^~|@] pattern { ... } [=|~|~*|^~|@] 被称作 location modifier ...

  6. nginx中location详解

    Location block 的基本语法形式是: location [=|~|~*|^~|@] pattern { ... } [=|~|~*|^~|@] 被称作 location modifier ...

  7. nginx location详解(三)

    location官方文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#location Syntax: location [ = | ...

  8. nginx配置文件中的location详解

    location 语法:location [=|~|~*|^~] /uri/ { … } 默认:否 上下文:server 这个指令随URL不同而接受不同的结构.你可以配置使用常规字符串和正则表达式.如 ...

  9. nginx语法之location详解

    Location语法优先级排列 匹配符 匹配规则 优先级 = 精确匹配 ^~ 以某个字符串开头 ~ 区分大小写的正则匹配 ~* 不区分大小写的正则匹配 !~ 区分大小写不匹配的正则 !~* 不区分大小 ...

随机推荐

  1. asp.net identity的学习记录

    # identity数据库 ## 创建空数据库 交给ef管理 ### 添加asp.net identity包 ``` Install-Package Microsoft.AspNet.Identity ...

  2. (三十七)js改变this指向的方法

    最近又遇到了JacvaScript中的call()方法和apply()方法,而在某些时候这两个方法还确实是十分重要的,那么就让我总结这两个方法的使用和区别吧. 1.改变函数内部的this指向的三种方法 ...

  3. c语言编译执行过程

    <h4>认识C编译执行过程</h4>认识C编译执行过程,是C学习的开端.简单说C语言从编码编译到执行要经历一下过程: C源代码编译---->形成目标代码,目标代码是在目标 ...

  4. self = [super init] 最终解释

    答:      init 中调用super的 init方法来初始化自己所包含有的父类信息 1.内存分配      内存应该在[Class alloc]的时候就已经分配了,大小和类型应该由对应的Clas ...

  5. SCARA——OpenGL入门学习四(颜色)

    OpenGL入门学习[四] 本次学习的是颜色的选择.终于要走出黑白的世界了~~ OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 无论哪种颜色模式,计算机都必须为每一个像素保存一些数 ...

  6. 文本溢出显示省略号,CSS未加载时a标签仍可用处理方法

    一.文本溢出打点 (1)单行文本 overflow: hidden; text-overflow:ellipsis; white-space: nowrap; (2)多行文本 overflow : h ...

  7. 配置linux下面python的开发环境

    1.首先安装Python开发环境 http://blog.csdn.net/testcs_dn/article/details/51253365 2.安装django开发环境 http://blog. ...

  8. 谨慎安装Python3.7.0,SSL低版本导致Pip无法使用

    最新新配置了一台服务器.安装 的时候直接使用了最新的Python 3.7最新版本. 安装成功,编译成功.但是用pip 安装包的时候提示:pip is configured with locations ...

  9. AUL恢复truncate删除的表

    背景 接到用户申告,新毕业的兄弟不小心把数据库中的3个关键表给truncate了,由于这个业务还在测试阶段,系统没有任何形式的备份. 客户的OS平台是windows平台,数据库是Oracle9207 ...

  10. 一个工程实例来学习 Makefile

    March 3, 2015 8:19 PM Makefile 文件的编写 学习前的准备 需要准备的工程目录结构如下: . ├── add │   ├── add_float.c │   ├── add ...