Nginx location 你需要了解匹配规则

Location是什么?


Location是Nginx中的块级指令(block directive),
通过配置Location指令块,可以决定客户端发过来的请求URI如何处理(是映射到本地文件还是转发出去)及被哪个location处理

 

Location基本语法


修饰符(modifier)         

location [ = | ~ | ~* | ^~ ]     uri     { ... } 
//中括号中为修饰符,可以不写任何参数,此时称为一般匹配,也可以写参数,location根据不同的修饰符可以分为两大类
  1. 前缀location(prefix location): 
    无修饰符的普通location     [普通匹配]
    带=的精准匹配location   [精准匹配]
    带^~的非正则表达式location   [忽略正则匹配]    只需匹配uri部分
  2.正则表达式location(regular expressions location):
    ~    区分大小写的正则location  [正则匹配]
    ~*   不区分大小写的正则location  [正则匹配]  这里要注意忽略大小写的意思是请求的字符大小写都可以

 

精确匹配


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

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/local/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:普通匹配的前后顺序是无所谓的,因为记录的是最长的结果,而正则匹配是按从上到下匹配的,这个需要注意!!!

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

 

实际使用建议


实际使用中,个人觉得至少有三个匹配规则定义,如下:

(1)直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。这里是直接转发给后端应用服务器了,也可以是一个静态首页
第一个必选规则location = / {
proxy_pass  http://tomcat:8080/index
}

(2)第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项,两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}

(3)第三个规则就是通用规则,用来转发动态请求到后端应用服务器
非静态文件请求就默认是动态请求,自己根据实际把握,毕竟目前的一些框架的流行,带.php,.jsp后缀的情况很少了
location / {
proxy_pass  http://tomcat:8080/
}
发布了289 篇原创文章 · 获赞 323 · 访问量 39万+

猜你喜欢

转载自blog.csdn.net/qq_34556414/article/details/104813865
今日推荐