zoukankan      html  css  js  c++  java
  • 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正则表达式的这种情况,那怎么发挥作用呢?

  • 相关阅读:
    三级菜单
    包的初识和进阶&异常处理
    常用模块一
    flask-script
    DBUtils
    Flask-WTForms
    Flask-SQLAchemy
    Flask
    scrapy-redis的使用和解析
    Django的信号;flask的信号;scrapy的信号;
  • 原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/6542339.html
Copyright © 2011-2022 走看看