Nginx实现API统一转发需location^~/api/匹配+rewrite剥离前缀+proxy_pass转发,确保路径干净透传、地址栏不变;需前置API规则、透传关键Header,并与SPA fallback互不干扰。

前后端分离项目中,Nginx 实现 API 统一转发入口,核心不是靠 rewrite 单独干活,而是用 location 匹配 + proxy_pass 转发 +(可选)rewrite 剥离前缀 三层配合。目标很明确:所有带 /api/ 的请求,都干净地转给后端服务,且浏览器地址栏不变、路径不暴露内部结构。
统一入口:用 location 精准拦截 /api/ 请求
这是第一步,也是最关键的路由分发点。必须把 API 流量从其他请求中提前“抓出来”,避免被后续的 SPA fallback 规则误吞。
- 推荐用
location ^~ /api/:表示前缀匹配,匹配上就停止正则搜索,性能好又稳定 - 不要用
location /api/(无修饰符),它优先级低,可能被更宽泛的location /覆盖 - 如果后端有多个 API 分组(如
/api/v1/、/api/admin/),可分别配置多个location ^~ /api/v1/和location ^~ /api/admin/,指向不同 upstream
剥离前缀并转发:rewrite + proxy_pass 协同工作
前端请求是 /api/users/123,后端真实接口是 /users/123 —— 中间差一个 /api 前缀。Nginx 需在转发前把它去掉。
- 写法示例:
location ^~ /api/ {<br> rewrite ^/api/(.*)$ /$1 break;<br> proxy_pass http://backend_service;<br>} -
rewrite中的break很关键:表示重写后不再查找其他 location,直接走当前块里的proxy_pass -
proxy_pass末尾不加/(即写成http://backend_service,不是http://backend_service/),才能确保重写后的路径完整透传过去
避免常见陷阱:路径拼接和 header 透传
看似简单的转发,实际容易出错的点集中在路径拼接和请求头丢失上。
- 如果
proxy_pass http://backend_service/(结尾有斜杠),Nginx 会自动剥离/api/前缀——但这和 rewrite 冲突,不建议混用;统一用 rewrite + 不带斜杠的 proxy_pass 更可控 - 务必添加基础 header 透传,否则后端可能拿不到真实客户端 IP 或 Host:
proxy_set_header Host $host;<br>proxy_set_header X-Real-IP $remote_addr;<br>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
- 若后端依赖原始请求路径做鉴权或日志,可加:
proxy_set_header X-Original-URI $request_uri;
与前端路由共存:和 SPA fallback 规则互不干扰
整个站点只有一个域名和端口,/api/ 走后端,其余路径交给前端 index.html 处理。两者必须隔离清楚。
- API location 必须放在
location /块之前(Nginx 按配置顺序匹配,先匹配到的优先生效) - SPA fallback 规则保持简洁:
location / {<br> try_files $uri $uri/ /index.html;<br>} - 这样,
/api/login→ 进入第一段 location → 转发;/user/profile→ 不匹配任何 API location → 进入location /→ 返回 index.html → 前端 Router 解析


















