之前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. F. Coprime Subsequences

    题目链接: F. Coprime Subsequences time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  2. C++ 资源管理 —— RAII

    RAII:在构造函数中申请资源,在析构函数中释放资源. 1. RAII 自动实现锁资源的释放 void bad() { m.lock(); f(); if (COND) return; m.unloc ...

  3. Metasploit的基本使用

    Metasploit可以在Linux.Windows和Mac OS X系统上运行.我假设你已安装了Metasploit,或者你使用的系统是Kali Linux.它有命令行接口也有GUI接口. 我使用的 ...

  4. I.MX6 U-Boot ping网络

    /********************************************************************* * I.MX6 U-Boot ping网络 * 说明: * ...

  5. (十七)js bom/dom

    window 是所有BOM中所有对象的核心. window 的属性 window.self代表自己本身,相当于window. eg: console.log(window.self === windo ...

  6. HihoCoder 1097 kruscal

    最小生成树二·Kruscal算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 随着小Hi拥有城市数目的增加,在之间所使用的Prim算法已经无法继续使用了——但是幸运的 ...

  7. MYSQL 级联 添加外键

    MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作 ...

  8. MySQL免安装版安装配置、修改密码

    一:MySQL的下载安装 1.1 下载 我下载的是 ZIP Archive 版的,win7 64位的机器支持使用,而且相对而言,简单.干净. 首先,进入MySQL的官方网址,依次点击Downloads ...

  9. 洛谷 P2626 斐波那契数列(升级版)

    题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ 2 且 n 为整数). 题目描述 ...

  10. redis list结构

    一个功能肯定有其应用场景: PUSH和POP操作,其实是队列的基本操作.Redis的list就是一个极其强大的队列系统.我们在哪些地方会用到队列呢?下面,我们说两个例子: a,评论系统 逛过微博的筒子 ...