Nginx location

Location 知识

Location是快速定位资源的,平时默认都是在根目录下面,我们可以通过配置Location指令块,来决定客户端发过来的请求URI如何处理。(location是根据Uri来进行不同的定位,location可以把网站的不同部分,定位到不同的处理方式上)

 

语法

location [=|~|~*|^~] patt { }  //中括号中为修饰符,可以不写任何参数,此时称为一般匹配,也可以写参数

因此,大类型可以分为四种:

location = patt {} [精准匹配]

location ^~patt{}  [忽略正则匹配]

location ~ patt{}  [正则匹配]

location patt{}     [普通匹配]

 

location 配置可以有两种配置方法,可以在server指令块和location指令块配置。

1、修饰符(=  ~  ~*  ^~  @) + uri(资源路径)

2、@ + name

 

修饰符

= :精确匹配(必须全部相等)

~ :大小写敏感(正则表达式)

~* :忽略大小写(正则表达式),这里要注意忽略大小写的意思是请求的字符大小写都可以,

但是不会进行大小转换,请求的大小写对应的文件必须存在。

^~ :只需匹配uri部分

@ :内部服务跳转

 

精确匹配

默认是/,即所有的资源都跑到/下面去找,这样速度比较慢,可以直接定位location=/    location / {

          […]

        }

location = /abcd {

 […]    

}

http://website.com/abcd匹配,其他的如http://website.com/abcd/,http://website.com/abcde都是不匹配的会返回404

  

区分大小写        

下面使用echo模块来测试,测试一下匹配到哪个location,location里面的jpg资源是可以不存在的,即使用echo打印看调用哪个模块

location ~/jfedu.jpg {
           echo "this is ~/jfedu.jpg";
       }

      location ~/JFEDU.jgp {
           echo "this is ~/JFEDU.jpg";
          }

[root@www ~]# curl 192.168.179.99/jfedu.jpg
this is ~/jfedu.jpg
[root@www ~]# curl 192.168.179.99/JFEDU.jgp
this is ~/JFEDU.jpg
可以看到是区分大小写的,大小写不一样匹配到的location是不一样的

 

不区分大小写

location ~* /jfedu.jpg {
           echo "this is ~/jfedu.jpg";
       }
[root@www ~]# curl 192.168.179.99/jfedu.jpg
this is ~/jfedu.jpg
[root@www ~]# curl 192.168.179.99/JFEDU.jpg
this is ~/jfedu.jpg
[root@www ~]# curl 192.168.179.99/jfedu.JPG
this is ~/jfedu.jpg
这样写一个location就行了,不用像上面大小写敏感写两个location。

下面防盗链也使用了不区分大小写

location ~* \.(gif|jpg|png|swf|flv)$ {

valid_referers none blocked lutixia.net *.jfedu.net;

root /usr/share/nginx/html;

if ($invalid_referer) {

return 403;

}}

 

”@” nginx内部跳转

location /img/ {
error_page 404 @img_err;
}
location @img_err {
}
以 /img/ 开头的请求,如果链接的状态为 404。则会匹配到 @img_err 这条规则上

 

忽略正则匹配

^~,只匹配以 uri 开头,匹配成功以后,会停止搜索后面的正则表达式匹配

 location  ^~/img/{
         echo "this is img";
        }
只要uri以/img/ 开头的请求,都会匹配上,不管后面是什么类型的资源
[root@www ~]# curl 192.168.179.99/img/
this is img
[root@www ~]# curl 192.168.179.99/img/abc
this is img

 

优先级问题 

(1)

location ~* /img/jfedu.jpg {
           echo "this is ~*/jfedu.jpg";
       }
location ~ /img/jfedu.jpg {
           echo "this is ~jfedu.jpg";
       }
location = /img/JFEDU.jpg {
           echo "this is =/JFEDU.jpg";
       }
location  ^~/img/{
         echo "this is ^~/img/";
        }
[root@www ~]# curl 192.168.179.99/img/JFEDU.jpg  --可以看到先匹配到的是精准匹配,正则和忽略正则优先级都没精准高
this is =/JFEDU.jpg

 

(2)

location ~* /img/jfedu.jpg {
           echo "this is ~*/jfedu.jpg";
       }
location ~ /img/jfedu.jpg {
           echo "this is ~jfedu.jpg";
       }
location  ^~/img/{
         echo "this is ^~/img/";
        }
这里就剩下正则匹配和忽略正则匹配
[root@www ~]# curl 192.168.179.99/img/jfedu.jpg --可以看到先匹配到的是忽略正则,忽略正则优先级比正则要高
this is ^~/img/

 

(3)

location ~* /img/jfedu.jpg {
           echo "this is ~*/jfedu.jpg";
       }
location ~ /img/jfedu.jpg {
           echo "this is ~jfedu.jpg";
       }
[root@www ~]# curl 192.168.179.99/img/jfedu.jpg  --可以看到正则之内优先级和顺序有关
this is ~*/jfedu.jpg

 

location命中过程:

1.先进行精准匹配,如果命中立即返回结果并结束解析的过程;

2.精准匹配未命中判断普通匹配,如果命中多个会记录下"最长的"命中结果,但不会结束解析;

3.继续判断正则匹配,按照正则匹配设置的规则正则表达式进行匹配,如果有多个正则匹配则由上到下进行匹配,一旦匹配成功一个会立即返回结果并结束解析.

ps:普通匹配的前后顺序是无所谓的,因为记录的是最长的结果,而正则匹配是按从上到下匹配的,这个需要注意!!!

优先级 精准匹配>非正则匹配>正则匹配由上到下>普通匹配

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章