我是靠谱客的博主 兴奋短靴,最近开发中收集的这篇文章主要介绍Nginx location 你需要了解匹配规则,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Location是什么?


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

匹配模式

分为两种模式:

  • 绝对匹配:调用的请求Path固定为创建时填写的API请求Path。
  • 前缀匹配:调用的请求Path将以创建时填写的API请求Path为前缀,支持接口定义多个不同Path。

    例如,请求路径为/test/AA,使用前缀匹配时,通过/test/AA/CC可以访问,但是通过/test/AACC无法访问。

说明:

使用前缀匹配时,匹配剩余的路径将透传到后端。

例如,使用前缀匹配,前端请求路径定义为/test/,后端请求路径定义为/test2/,通过/test/AA/CC访问API,则后端收到的请求url为/test2/AA/CC。

 

 

 

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.jpg
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/
}

最后

以上就是兴奋短靴为你收集整理的Nginx location 你需要了解匹配规则的全部内容,希望文章能够帮你解决Nginx location 你需要了解匹配规则所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部