Nginx可通过正则location匹配路径前缀式API版本(如/v1/xxx),捕获版本号并重写转发至对应后端服务,无需修改业务代码。示例配置实现/v1/与/v2/分流,支持透传版本头及404兜底。

在微服务架构中,Nginx 常被用作前置网关,统一处理路由、鉴权、限流和版本分发。通过正则表达式匹配 API 路径并重写为对应后端服务版本,是轻量又灵活的版本管理方式——无需修改业务代码,也不依赖 SDK 或中间件。
一、明确版本路径映射需求
常见版本格式有三种:/v1/users、/api/v2/orders、/users?version=v3。本文聚焦最易控、最直观的路径前缀式(如 /v2/xxx),用 Nginx 的 location ~ ^/v\d+/ 捕获版本号,并将其透传或重写到上游服务。
二、配置正则 location + 变量捕获
Nginx 支持在 location ~ 中使用带括号的正则,自动将匹配内容存入 、 等变量。例如:
-
location ~ ^/v(\d+)/(.*$) {—— 匹配 /v1/users/list,捕获$1=1,$2=users/list - 可结合
proxy_pass重写目标地址,如转向 http://svc-v1/users/list 或 http://backend/$2?version=$1 - 注意:
proxy_pass后若带 URI(如/),会丢弃原始匹配路径;不带则保留——需按需选择
三、实战配置示例(支持多版本分流)
以下配置将 /v1/xxx 转给 v1 服务,/v2/xxx 转给 v2 服务,其余路径返回 404:
upstream svc-v1 {
server 10.0.1.10:8080;
}
upstream svc-v2 {
server 10.0.1.11:8080;
}
<p>server {
listen 80;
server_name api.example.com;</p><pre class='brush:php;toolbar:false;'># 匹配 /v1/xxx → 转发到 svc-v1,路径去前缀
location ~ ^/v1/(.*)$ {
proxy_pass http://svc-v1/$1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
# 匹配 /v2/xxx → 转发到 svc-v2,同时注入 version header
location ~ ^/v2/(.*)$ {
proxy_pass http://svc-v2/$1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-API-Version $1; # 可选:透传版本信息
}
# 默认兜底:未匹配版本路径,返回 404
location / {
return 404 "Unsupported API version or path\n";
}}
四、验证与调试技巧
上线前务必验证正则逻辑是否符合预期:
- 用
nginx -t检查语法;用nginx -s reload热更新 - 开启
error_log /var/log/nginx/debug.log debug;查看 location 匹配过程(需编译含 debug 日志模块) - curl 测试:
curl -v http://api.example.com/v2/users,观察响应头、后端日志及返回内容 - 注意特殊字符转义:如匹配
/v1.2/需写成^/v1\.2/,点号必须加反斜杠


















