Nginx高级应用之Location Url 配置(2)

正常匹配的指令为空,即没有指定匹配指令的即为正常匹配。其形式类似 /XXX/YYY.ZZZ正常匹配中的url匹配模式可以使用正则,不区分大小写。

location /demo {        rewrite ^ ; }

上述模式指的是匹配/demo的url,下面的都能匹配

正常匹配和前缀匹配的差别在于优先级。前缀的优先级高于正常匹配

全匹配

全匹配与正常匹配一样,没有匹配指令,匹配的url模式仅一个斜杠/

location / {        rewrite ^ ; }

全匹配也可以配合 精确匹配和正则匹配一些指令,只不过这样的设定意义不大。通过都会有一个默认的location,这个就是全匹配。

命名匹配

命名匹配指的是使用@比绑定一个模式,类似变量替换的用法。

error_page 404 = @not_found location @not_found {          rewrite ; }

上述的作用是如果访问没有匹配的url会触发404指令,然后就匹配到@not_found 这个 location上。

匹配优先级

nginx的匹配优先级遵循一个大原则两个小细节

大原则是关于匹配模式的优先级:

精确匹配  >  前缀匹配  >  正则匹配  > 正常匹配  > 全匹配

小细节则是同一优先级中:

细节一:正则匹配成功之后停止匹配,非正则匹配成功还会接着匹配。

细节二:在所有匹配成功的url中,选取匹配度最大的url字符地址。

不同级匹配模式优先级原则 精确匹配 > 前缀匹配

=精确匹配的优先级最高,这与配置的先后顺序无关

location ^~ /demo{        rewrite ^ ; } location = /demo {        rewrite ^ ; }

访问

      -> baidu.com -> google.com

尽管前缀匹配也能匹配/demo这个地址,并且还先命中,可是=的优先级更高。

再把前缀匹配换成正则匹配

location ~ /demo{        rewrite ^ ; } location = /demo {        rewrite ^ ; }

访问结果仍然一样。精确匹配的优先级最高。

前缀匹配 > 正则匹配 location ~ /[ad]emo{        rewrite ^ ; } location ^~ /demo {        rewrite ^ ; }

上述两个模式中,第一个使用正则匹配,第二个使用前缀匹配,访问效果如下

      -> baidu.com     -> google.com

由此可见,尽管也是正则匹配先命中规则,可以优先级低,还是让步给前缀匹配。

正则匹配 > 正常匹配 location /demo/aa{          rewrite ^ ; } location ~ /[ad]emo {          rewrite ^ ; }         -> baidu.com       -> baidu.com

访问/demo/aa的地址的时候,尽管前者位置在前,并且也匹配最长,可是大规则的优先级,还是要先进行后面的正则匹配。小细节也必须让步大规则。

正常匹配 > 全匹配 location / {        rewrite ^ ; } location /demo {        rewrite ^ ; }

访问结果

          -> index.html         -> google.comg        -> baidu.com    -> baidu.com

由此可见,全匹配的优先级最低。

同级匹配细节

同级的匹配需要注意两个关键细节,是否是正则匹配是否是最长匹配

非正则匹配 location /demo {        rewrite ^ ; } location /demo/aa {        rewrite ^ ; }

访问测试

     -> google.com  -> baidu.com

第一个连接只匹配了第一个location,跳转google.com;第二个连接两者都匹配,可是第二个location的匹配字符更长,因此跳转了baidu.com。

把正常匹配换成前缀匹配的效果也一样。

location ^~ /demo {        rewrite ^ ; }   location ^~ /demo/aa {        rewrite ^ ; }

访问结果如下:

     -> google.com  -> baidu.com

通过上面的测试,可见同级的非正则的匹配,匹配结果最长的location最终会被命中。其实这个很好理解,匹配的字符越多,优先级越大嘛。但是为什么这个原则要特指非正则的匹配呢?

正则匹配

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e07b747da3ba7a1f266f26cd5ab63e34.html