nginx(location详细讲解)

location有定位的意思。根据uri来定位不同的部分。

语法:

location[=|~|~*|^~] patt {

}

= :表示精确匹配,这个优先级也是最高的。

^~ :表示uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被规则^~ /static/ /aa匹配到(注意是空格)。

~:表示区分大小写的正则匹配。

~*:表示不区分大小写的正则匹配(和上面的唯一区别就是大小写)!~和!~*分别为区分大小写不匹配及不区分大小写不匹配的正则 / 通用匹配,任何请求都会匹配到,默认匹配。

多个location配置的情况下匹配顺序为:

优先级=>^~>

说明:首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,停止匹配,按当前匹配规则处理请求。

中括号可以不写任何参数,此时称为一般匹配。也可以写参数。

因此,大类可以分为3中。

Location=patt{}[精准匹配]

Location patt{}[一般匹配]

Location ~ patt{}[正则匹配]

location的匹配过程:

总结:location的命中过程是这样子的

1:先判断精准命中,如果命中,立即返回结果并结束解析过程。

2:判断普通命中,如果有多个命中,”记录”下来”最长”的命中结果(注意:记录但不是结束,最长的为准)

3:继续判断正则表达式的解析过程,按配置里的正则表达式 为准,由上到下开始匹配,一旦匹配成功1个,立即返回结果,并结束解析过程。

延伸分析:A:普通命中,顺序无所谓,是因为按命中的长短来确定的。B:正则命中,顺序有所谓,因为是从前往后命中的。
精准匹配

 

首先看有没有精准匹配,如果有,则停止匹配过程。

    Location = patt {
     
             ConfigA
     
    }

如果 $uri==patt,匹配成功,使用configA

举例说明:

    location = / {
     
                       root   /var/www/html/;
     
                       index  index.htm index.html;
     
    }
     
    location  /  {
     
             Root /usr/location/nginx/html;
     
             Index index.html index.htm;
     
    }

访问http://xxx.com/

定位流程是:

1、  精准匹配中“/”,得到index也为 index.htm.

2、  再次访问/index.htm,此次内部跳转uri已经是”/index.htm”,更目录为/usr/local/nginx/html

3、最终结果为,访问到了/usr/local/nginx/html/index.htm
正则匹配

    location /  {
     
             root  /usr/local/nginx/html;
     
             index  index.html index.htm;
     
    }
     
    location ~ image {
     
             root  /var/www/image;
     
             index  index.html;
     
    }

此时如果我们访问http://xx.com/image/logo.png

此时,”/” 与”/image/logo.png”匹配

同时,“image”正则与”image/logo.png”也能匹配,谁发挥作用?

正则表达式成果将会使用。

图片真正访问/var/www/image/logo.png
普通匹配

     
    location / {
     
                root   /usr/local/nginx/html;
     
                index  index.html index.htm;
     
            }
     
    location /foo {
     
               root /var/www/html;
     
                index index.html;
     
    }

我们访问 http://xxx.com/foo

 对于uri “/foo”,   两个location的patt,都能匹配他们

即‘/’能从左前缀匹配‘/foo’, ‘/foo’也能左前缀匹配’/foo’,

此时, 真正访问 /var/www/html/index.html

原因:’/foo’匹配的更长,因此被使用

发表评论

电子邮件地址不会被公开。 必填项已用*标注