nginx配置文件之location匹配详解

19次阅读

共计 1174 个字符,预计需要花费 3 分钟才能阅读完成。

作为一名 PHPer,配置 nginx 是我们必会的技能项之一。但是当用户请求到达 nginx 之后,是如何匹配到对应的配置项的呢?
location 语法规则
首先我们先了解下 location 的语法规则,location 语法规则大致可以分为两类
一类是指定 URL 地址:
location [= | ~ | ~* | ^~] uri {

}
另一类则是指定自定义名称:
location @name {

}
@name 是对 location 设置的一个自定义名称,由 @+ 自定义命名组成,一般用于 try_files 后面的内部请求,且自定义命名 location 中不可再嵌套自定义命名 location
举例:
location @xuzheng{

}
location 修饰符含义
上文我们提到 location 语法规则有一类是指定 URL 地址,其中运用了一些修饰符,下面我们看下这些修饰符的含义
1、= 表示精确匹配。只有请求的 url 路径与后面的字符串完全相等时,才会命中。
举例:
location = / {

}
2、~ 表示该规则是使用正则定义的,区分大小写。
举例:
location ~ \.php$ {

}
3、~* 表示该规则是使用正则定义的,不区分大小写。
举例:
location ~* \.php$ {

}
4、^~ 是前缀匹配的一种,但是如果该符号后面的字符被匹配上,则被默认为最佳匹配,即采用该规则,不再进行后续的查找。
举例:
location ^~ /blogs {

}
location 匹配优先级
最后,我们了解下 location 的查找规则。下面列出的 location 查找,从上到下的优先级为从高到低
1、等号类型,精确匹配 2、^~ 类型,前缀匹配,不支持正则,如果该符号后面的字符匹配被匹配上,则被默认为最佳匹配,不再继续往下查找 3、~ 和~* 类型,正则匹配,~ 区分大小写,~* 不区分大小写 4、前缀匹配类型,如 location / {}(表示任何以 / 开头的 URL 都匹配)或 location /user {},只不过找到合适了还会继续往下找,直到找到最长匹配注:使用正则匹配的规则时,顺序很重要,location 只要找到第一个符合条件的配置规则就会停止查找,即使下面有更匹配的配置
总结
location 匹配过程:
1、首先先检查使用前缀匹配(即字符串匹配)定义的 location,选择最长匹配的项并记录下来 2、如果找到了精确匹配的 location,也就是使用了 = 修饰符的 location,结束查找,使用它的配置。如果没有找到合适精确匹配,则继续往下查找 3、如果找到了包含 ^~ 的前缀匹配,则停止查找,使用它定义的配置。如果没有找到合适的带 ^~ 符号的前缀匹配,则继续往下查找 4、如果找到了使用正则定义的 location,则停止查找,使用它定义的配置。如果没有找到合适的正则匹配,则继续往下查找 5、使用前面记录的最长匹配前缀字符 location。

正文完
 0