Nginx通过location匹配虚拟路径、proxy_pass末尾斜杠自动截断前缀实现后端服务映射,如/api/v1/→/;需配合proxy_redirect修正重定向头,确保响应路径与前端一致。

通过 Nginx 代理实现后端服务的虚拟路径映射,核心是用 location 匹配请求路径,再用 proxy_pass 转发到后端,并通过路径重写(如 rewrite 或 proxy_rewrite 风格的路径截断)让后端服务“感知不到”前端的虚拟前缀。
理解虚拟路径映射的关键逻辑
比如你希望用户访问 https://example.com/api/v1/users,实际调用的是运行在 http://localhost:8080/users 的服务——中间的 /api/v1 是虚拟前缀,后端并不处理这一层。Nginx 需要:
- 匹配以 /api/v1/ 开头的请求;
- 剥掉 /api/v1,只把 /users 部分转发给后端;
- 同时确保响应中的重定向地址、静态资源链接等也适配前端路径(必要时改写 Location 和 Content-Location 头)。
基础配置:使用 proxy_pass 截断路径
最常用且推荐的方式是利用 proxy_pass 末尾斜杠的截断行为:
- 当
proxy_pass以/结尾(如http://localhost:8080/),且location有路径前缀时,Nginx 会自动剥离该前缀再拼接; - 若不加结尾斜杠(如
http://localhost:8080),则整个匹配路径(含前缀)都会被原样转发,通常不是你想要的。
示例配置:
location /api/v1/ {proxy_pass http://localhost:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
说明:访问 /api/v1/users → Nginx 剥掉 /api/v1/,转发 /users 到 http://localhost:8080/users。
进阶场景:需保留部分前缀或动态重写
如果后端期望路径中保留某一级(如只剥掉 /api,但保留 /v1/users),可用 rewrite 显式控制:
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://localhost:8080;
}
或者更灵活地映射多个版本:
location ~ ^/api/(?<version>v\d+)/(.*)$ {proxy_pass http://localhost:8080/$version/$2;
proxy_set_header X-API-Version $version;
}
注意:rewrite ... break 会在当前 location 内完成重写,不触发新 location 匹配;而 last 会重新匹配 location,慎用。
别忘了响应头和重定向的修正
后端返回 302 重定向时,常带 Location: /users/created 这样的绝对路径,直接返回会导致浏览器跳转到 https://example.com/users/created(404)。需用以下指令修正:
-
proxy_redirect / /api/v1/;:把响应头中以/开头的Location改为/api/v1/开头; - 支持正则:
proxy_redirect ~^/(.*)$ /api/v1/$1;; - 若后端返回的是完整 URL(如
http://localhost:8080/users),可用proxy_redirect http://localhost:8080/ https://example.com/api/v1/;。
同时建议加上:proxy_redirect default; 确保默认重定向行为也被接管。


















