之前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. Creating a Game with CocosBuilder

    Creating a Game with CocosBuilder This tutorial aims to show how you can use CocosBuilder together w ...

  2. GCC参数使用

    gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件[预处理器cpp] 2.将预处理后的文件不转换成汇编语言, ...

  3. 【解题报告】[动态规划] - PID90 / 未出现的子串

    原题地址:http://www.rqnoj.cn/problem/90 解题思路:题目看起来不太像动态规划... 我用一个数组f[i][j]来表示在数组第i个元素的后面第一次出现j的位置,为-1则是没 ...

  4. 一种 jquery 检索方案

    整理自:http://www.cnblogs.com/linjiqin/archive/2011/03/18/1988464.html <!DOCTYPE HTML PUBLIC "- ...

  5. js插件大全 jquery插件大全

    CocoaUI - 一个强大的 iOS UI 框架 http://www.cocoaui.com/ tab,slider,轮播不错的说 http://www.superslide2.com/index ...

  6. Oracle与Mysql操作表序列

    一.Oracle添加表序列 CREATE SEQUENCE name -- 序列名 INCREMENT BY -- 每次加几个 START WITH -- 从几开始计数 MINVALUE --- 最小 ...

  7. AppScan 8.0.3安全漏洞扫描总结

    本文记录了通过AppScan 8.0.3工具进行扫描的安全漏洞问题以及解决方案, 1.使用SQL注入的认证旁路 问题描述: 解决方案: 一般通过XSSFIlter过滤器进行过滤处理即可,通过XSSFI ...

  8. SSM框架——整合搭建流程

    1.首先创建maven工程,使用哪种方式进行创建都可以,可以参考博主之前的文章: <两种方式创建Maven项目[方式二]><两种方式创建Maven项目[方式一]> 2.先看看搭 ...

  9. 笔记:LIR2032 电池充电记录

    笔记:LIR2032 电池充电记录 LIR2032 电池是锂电池,形状和 CR2032 一样,只不过可以充电,材料是锂离子. 一个单颗的 LIR2032 电池容量只有 40mAH,容量很小. 那么就需 ...

  10. AGC006 C Rabbit Exercise——思路(置换)

    题目:https://agc006.contest.atcoder.jp/tasks/agc006_c 选了 i 位置后 x[ i ] = x[ i-1 ] + x[ i+1 ] - x[ i ] . ...