Nginx 匹配顺序和优先级

编辑于:2023年05月23日

Nginx 匹配顺序和优先级

Nginx中,location块用于处理不同的请求。当一个请求到来时,Nginx 会根据 location 块中的匹配规则选择一个合适的 location 块来处理请求。以下是 Nginx 匹配顺序和优先级的详细说明及示例:

1. 精确匹配(Exact match):

使用=修饰符表示精确匹配。精确匹配具有最高优先级。如果一个请求与精确匹配的 location 块完全相同,Nginx 会立即使用这个 location 块处理请求,不再进行后续匹配。

示例:

location = /cccitu{
    ...
}

此 location 仅匹配 URI 为/cccitu的请求。请求 URL:https://example.com/cccitu,匹配该 location。

正则表达式匹配(Regex match):

使用~(区分大小写)或~*(不区分大小写)修饰符表示正则表达式匹配,正则表达式匹配的优先级高于前缀匹配。

Nginx 会按照配置文件中的顺序进行正则匹配,一旦找到一个匹配的正则表达式,就会使用该 location 块处理请求,不再进行后续匹配。

示例:

location ~* \.(jpg|jpeg|png|gif)$ {
    ...
}

此 locatio n会匹配所有以.jpg.jpeg.png.gif结尾的请求,不区分大小写。请求 URL:https://example.com/images/test.JPG,匹配该 location。

前缀匹配(Prefix match):

前缀匹配是默认的匹配方式。Nginx 会选择最长的匹配前缀作为优先级。如果有多个前缀匹配的 location 块,最长的前缀匹配将被选中。

示例:

location /cccitu {
    ...
}

此 location 会匹配以/cccitu开头的所有请求。请求 URL:https://example.com/cccitu/some-page,匹配该 location。

优先级匹配顺序示例:

location = / {
    # 精确匹配,最高优先级
    ...
}

location /api/ {
    # 前缀匹配,较长前缀
    ...
}

location / {
    # 前缀匹配,较短前缀
    ...
}

location ~ ^/api/.+\.php$ {
    # 正则表达式匹配,区分大小写,按配置顺序
    ...
}

location ~* \.(jpg|jpeg|png|gif)$ {
    # 正则表达式匹配,不区分大小写,按配置顺序
    ...
}

根据上述配置,以下是各种请求URL的匹配结果:

  • ⭕请求URL:https://www.cccitu.com/,精确匹配的 location 块location = /将被选中,因为精确匹配具有最高优先级。
  • ⭕请求URL:https://example.com/api/test,最长前缀匹配的 location 块location /api/将被选中,因为它比location /具有更长的匹配前缀。
  • ⭕请求URL:https://example.com/api/test.php,正则表达式匹配的 location 块location ~ ^/api/.+\.php$将被选中,因为它在配置文件中的顺序优先于location ~* \.(jpg|jpeg|png|gif)$
  • ⭕请求URL:https://example.com/images/test.jpg,正则表达式匹配的 location 块location ~* \.(jpg|jpeg|png|gif)$将被选中,因为它匹配了文件扩展名,且不区分大小写。

综上所述,Nginx 的 location 匹配顺序和优先级如下:

  • ⭕精确匹配(Exact match):=
  • ⭕正则表达式匹配(Regex match):~(区分大小写)和~*(不区分大小写),按照配置文件中的顺序进行匹配。
  • ⭕最长前缀匹配(Longest prefix match)

在编写 Nginx 配置文件时,关键在于了解 location 块的匹配顺序和优先级,以确保请求被正确地路由到合适的 location 块。在处理可能存在冲突的规则时,要确保优先级较高的规则放在前面,以便它们能够正确地覆盖和执行。

例如,在处理 PHP 脚本的执行与特定目录下的文件访问限制时,应将访问限制的 location 块放在 PHP 执行规则之前,以确保访问限制能够正确地生效。

相关推荐

暂无评论