Nginx路由匹配规则说明
-
-
- **一、Nginx路由匹配核心机制**
- **二、匹配规则语法详解**
-
- [1. **精确匹配 (`=`)**](#1. 精确匹配 (
=
)) - [2. **前缀匹配 (`^~` 或 `/`)**](#2. 前缀匹配 (
^~
或/
)) - [3. **正则匹配 (`~` 或 `~*`)**](#3. 正则匹配 (
~
或~*
)) - [4. **通配符匹配 (`*`)**](#4. 通配符匹配 (
*
))
- [1. **精确匹配 (`=`)**](#1. 精确匹配 (
- **三、路由匹配优先级顺序**
- **四、高级路由技巧**
-
- [1. **条件判断 (`if`语句)**](#1. 条件判断 (
if
语句)) - [2. **路径重写 (`rewrite`指令)**](#2. 路径重写 (
rewrite
指令)) - [3. **负载均衡路由**](#3. 负载均衡路由)
- [1. **条件判断 (`if`语句)**](#1. 条件判断 (
- **五、实战案例:多版本API路由**
- **六、常见陷阱与调试**
-
- [1. **优先级错误**](#1. 优先级错误)
- [2. **正则表达式性能**](#2. 正则表达式性能)
- [3. **日志调试**](#3. 日志调试)
- **七、总结**
-
以下是Nginx路由匹配规则的详细解析,包含优先级、匹配语法、实战案例及常见陷阱:
一、Nginx路由匹配核心机制
Nginx通过location
指令定义路由规则,匹配顺序基于优先级,具体规则如下:
优先级级别 | 匹配规则 | 示例 | 说明 |
---|---|---|---|
最高优先级 | = (精确匹配) |
location = /api/v1/ |
只匹配完全匹配的URI,优先级最高 |
次高优先级 | ^~ (前缀匹配,最长匹配) |
location ^~ /api/ |
匹配以/api/ 开头的URI,且选择最长的匹配路径 |
第三优先级 | ~ (正则匹配) |
`location ~* .(jpg | css)$` |
最低优先级 | 通配符* (模糊匹配) |
location /files/.* |
匹配以/files/ 开头的任意路径 |
二、匹配规则语法详解
1. 精确匹配 (=
)
• 语法 :location = /path/ { ... }
• 特点 :仅匹配完全相同的URI,优先级最高 。
• 案例:
nginx
location = /login {
proxy_pass http://backend/login;
}
• 只有请求/login
时会触发该规则,/login/api
不会匹配。
2. 前缀匹配 (^~
或 /
)
• 语法 :location ^~ /api/ { ... }
或 location /api/ { ... }
• 特点 :
• ^~
表示严格前缀匹配,最长匹配优先 。
• 单斜杠/
等同于^~ /
,但优先级低于^~
。
• 案例:
nginx
location ^~ /api/v1/ {
proxy_pass http://v1-backend;
}
location ^~ /api/v2/ {
proxy_pass http://v2-backend;
}
• 请求/api/v1/test
匹配第一个规则,/api/v1/old
匹配最长路径。
3. 正则匹配 (~
或 ~*
)
• 语法 :
• ~
:区分大小写的正则匹配
• ~*
:不区分大小写的正则匹配
• 示例:
nginx
# 匹配所有以.jpg或.png结尾的请求(不区分大小写)
location ~* \.(jpg|jpeg|png)$ {
expires 30d;
}
• 正则表达式需用^
和$
包裹以明确匹配范围。
4. 通配符匹配 (*
)
• 语法 :location /path/*/file.html { ... }
• 特点 :
• *
匹配任意字符(除斜杠)零次或多次。
• 优先级最低 ,仅当前面规则未匹配时生效。
• 案例:
nginx
location /static/* {
alias /var/www/static/;
}
• 请求/static/image.jpg
会被映射到/var/www/static/image.jpg
。
三、路由匹配优先级顺序
Nginx的路由匹配严格遵循优先级顺序:
1. = 精确匹配
2. ^~ 前缀匹配(最长匹配)
3. ~ 正则匹配(区分大小写)
4. ~* 正则匹配(不区分大小写)
5. 通配符 *
示例:
nginx
location /api/ {
# 优先级4(通配符)
}
location ^~ /api/v1/ {
# 优先级2(前缀匹配),匹配/api/v1/及其子路径
}
location ~* \.json$ {
# 优先级3(正则),匹配所有.json文件
}
• 请求/api/v1/data.json
会匹配^~ /api/v1/
,而非正则规则。
四、高级路由技巧
1. 条件判断 (if
语句)
• 语法:
nginx
location /user/ {
if ($arg_version = "v2") {
proxy_pass http://v2-user-service;
}
default_type text/html;
return 404;
}
• 注意 :避免在location
块内使用复杂条件判断,可能导致性能问题。
2. 路径重写 (rewrite
指令)
• 语法:
nginx
location /old-path/ {
rewrite ^/old-path/(.*)$ /new-path/$1 permanent;
}
• 作用 :将/old-path/user
重定向到/new-path/user
。
3. 负载均衡路由
• 语法:
nginx
upstream backend {
server backend1.example.com;
server backend2.example.com;
}
location /api/ {
proxy_pass http://backend;
}
• 扩展 :结合upstream
模块实现加权轮询、IP哈希等策略。
五、实战案例:多版本API路由
需求:
• /api/v1/*
→ 版本1
• /api/v2/*
→ 版本2
• /admin/*
→ 管理后台
配置:
nginx
# 最高优先级:精确匹配/admin/
location = /admin/ {
proxy_pass http://admin-backend;
}
# 前缀匹配/api/v1/ 和 /api/v2/
location ^~ /api/v1/ {
proxy_pass http://v1-api;
}
location ^~ /api/v2/ {
proxy_pass http://v2-api;
}
# 通配符匹配其他/api请求(兜底)
location /api/ {
proxy_pass http://default-api;
}
六、常见陷阱与调试
1. 优先级错误
• 问题 :误将通配符规则放在^~
规则前。
• 修复 :检查location
块的顺序,确保高优先级规则在前。
2. 正则表达式性能
• 问题 :使用低效的正则表达式(如.*
开头)导致匹配缓慢。
• 优化 :尽可能使用具体前缀(如~* \.(jpg|css)$
代替~* .*$
)。
3. 日志调试
• 指令:
nginx
error_log /var/log/nginx/error.log warn;
access_log /var/log/nginx/access.log;
• 调试命令:
bash
nginx -t # 测试配置语法
nginx -s reload # 重新加载配置
curl -I http://localhost/test # 查看响应头
七、总结
Nginx路由匹配的核心是优先级顺序 和规则语法的正确组合:
- 优先使用
^~
前缀匹配实现版本路由。 - **正则匹配
~*
**处理动态路径(如文件类型)。 - **通配符
*
**作为兜底规则。 - 避免在
location
块内嵌套复杂逻辑,保持配置简洁。
通过合理利用这些规则,可以实现灵活、高效的路由策略,支撑微服务架构的流量治理需求。