在
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 执行规则之前,以确保访问限制能够正确地生效。