在Nginx配置中,location
块用于定义如何处理不同的URI请求。其匹配规则和优先级是配置中的核心概念,以下是详细说明:
1. 匹配规则类型
Nginx的location
支持四种匹配方式,按优先级从高到低排列:
(1) =
精确匹配
- 仅当请求的URI与指定模式完全一致时匹配。
- 示例:
location = /login { # 仅匹配 /login,不匹配 /login/ 或 /login.html }
(2) ^~
前缀匹配(非正则)
- 匹配以指定模式开头的URI,一旦匹配成功则停止后续正则匹配。
- 示例:
location ^~ /static/ { # 匹配 /static/js/a.js,但不匹配 /static(末尾无斜杠时可能触发其他规则) }
(3) ~
或 ~*
正则匹配
~
:区分大小写的正则匹配。~*
:不区分大小写的正则匹配。- 按配置文件中的顺序匹配,个匹配成功的规则生效。
- 示例:
location ~ \.php$ { # 匹配所有以 .php 结尾的请求(如 /index.php) } location ~* \.(jpg|png)$ { # 匹配所有 .jpg 或 .png 结尾的请求(不区分大小写) }
(4) 普通前缀匹配
- 不带任何修饰符的前缀路径(如
/path/
)。 - 如果其他更高优先级的规则未匹配,则会检查此类规则。
- 示例:
location / { # 默认匹配所有请求,但优先级 }
2. 优先级顺序
=
精确匹配 >^~
前缀匹配 > 正则匹配(~
或~*
) > 普通前缀匹配。- 正则匹配按配置文件中的书写顺序生效,先匹配到的优先。
- 普通前缀匹配若有多条,选择最长前缀的规则。
3. 匹配流程示意图
请求URI → 检查`=` → 检查`^~` → 按顺序检查正则 → 最后检查普通前缀
4. 常见误区与注意事项
- 斜杠问题:
/static
和/static/
不同,后者要求URI末尾必须有斜杠。 - 正则顺序:
即使更宽泛的正则写在前面,也会优先匹配,因此需注意顺序。 - 性能优化:
高频路径建议用^~
或=
,避免正则回溯。
5. 示例配置
server {
location = /favicon.ico {
# 精确匹配,优先级
access_log off;
}
location ^~ /assets/ {
# 静态资源目录,避免正则检查
root /data;
}
location ~* \.(js|css)$ {
# 匹配JS/CSS文件,不区分大小写
expires 7d;
}
location / {
# 默认规则
try_files $uri $uri/ /index.html;
}
}
通过合理设计location
规则,可以高效处理不同类型的请求。