nginx执行请求的工做原理之location匹配详解

做为一名PHPer,配置nginx是咱们必会的技能项之一。可是当用户请求到达nginx以后,是如何匹配到对应的配置项的呢?php

location语法规则

首先咱们先了解下location的语法规则,location语法规则大体能够分为两类nginx

一类是指定URL地址:url

location [ = | ~ | ~* | ^~ ] uri {
    ... 
}

另外一类则是指定自定义名称:code

location @name { 
    ... 
}

@name是对location设置的一个自定义名称,由@+自定义命名组成,通常用于try_files后面的内部请求,且自定义命名location中不可再嵌套自定义命名locationblog

举例:字符串

location @xuzheng{
    ...
}

location修饰符含义

上文咱们提到location语法规则有一类是指定URL地址,其中运用了一些修饰符,下面咱们看下这些修饰符的含义io

一、 = 表示精确匹配。只有请求的url路径与后面的字符串彻底相等时,才会命中。class

举例:配置

location = / {
    ...
}

二、 ~ 表示该规则是使用正则定义的,区分大小写。file

举例:

location ~ \.php$ {
    ...
}

三、 ~* 表示该规则是使用正则定义的,不区分大小写。

举例:

location ~* \.php$ {
    ...
}

四、^~ 是前缀匹配的一种,可是若是该符号后面的字符被匹配上,则被默认为最佳匹配,即采用该规则,再也不进行后续的查找。

举例:

location ^~ /blogs {
    ...
}

location匹配优先级

最后,咱们了解下location的查找规则。下面列出的location查找,从上到下的优先级为从高到低

一、等号类型,精确匹配
二、^~类型,前缀匹配,不支持正则,若是该符号后面的字符匹配被匹配上,则被默认为最佳匹配,再也不继续往下查找
三、~~*类型,正则匹配,~区分大小写,~*不区分大小写
四、前缀匹配类型,如location / {}(表示任何以/开头的URL都匹配)或location /user {},只不过找到合适了还会继续往下找,直到找到最长匹配
注:使用正则匹配的规则时,顺序很重要,location只要找到第一个符合条件的配置规则就会中止查找,即便下面有更匹配的配置

总结

location匹配过程:

一、首先先检查使用前缀匹配(即字符串匹配)定义的location,选择最长匹配的项并记录下来
二、若是找到了精确匹配的location,也就是使用了=修饰符的location,结束查找,使用它的配置。若是没有找到合适精确匹配,则继续往下查找
三、若是找到了包含^~的前缀匹配,则中止查找,使用它定义的配置。若是没有找到合适的带^~符号的前缀匹配,则继续往下查找四、若是找到了使用正则定义的location,则中止查找,使用它定义的配置。若是没有找到合适的正则匹配,则继续往下查找五、使用前面记录的最长匹配前缀字符location。

相关文章
相关标签/搜索