Nginx路由重写核心是为微服务精准转发并隐藏后端路径,关键依赖location匹配、proxy_pass斜杠行为(带/则剥离前缀,不带则保留全路径)及可选rewrite介入,三者协同实现解耦与收敛。
微服务架构里,Nginx 做路由重写不是为了“改 URL 给用户看”,而是为了让请求精准落到对应服务上,同时隐藏后端路径细节、统一处理跨域和负载逻辑。关键不在 rewrite 指令本身,而在 proxy_pass 的斜杠行为 + location 匹配 + 可选的 rewrite 介入 这三者的配合。
这是最常用也最容易出错的一环。proxy_pass 后是否带斜杠,直接决定前端路径要不要被截掉:
location /api/user/ { proxy_pass http://user-svc:8081/; },访问 /api/user/profile 会被转成 /profile 发给后端。location /api/order { proxy_pass http://order-svc:8082;(没斜杠),访问 /api/order/list 就会原样发过去,后端收到的是 /api/order/list。当路径结构不规则、或要提取变量做转发时,rewrite 才真正派上用场。注意它必须在 proxy_pass 之前执行,且重写后需触发内部重定向(加 break 或 last):
/v2/product/123 改成 /product?id=123:
location ~ ^/v2/product/(d+)$ {rewrite ^/v2/product/(d+)$ /product?id=$1 break;
proxy_pass http://legacy-api:8000;
}
location ~ ^/api/(user|order)/(.*)$ {proxy_pass http://$1-backend/$2;
}
(依赖变量插值,要求 Nginx ≥1.3.14)在 Kubernetes 中,ingress-nginx 不推荐直接写 rewrite 规则,而是通过标准注解控制:
nginx.ingress.kubernetes.io/rewrite-target: /$2 —— 配合正则 path 使用,例如 /v1/(.*) 匹配后,把 $2 当作新路径;nginx.ingress.kubernetes.io/use-regex: "true" 必须开启才能用正则;rewrite-target: / 这种全局重写,容易破坏 API 层级结构。所有重写配置最终服务于三个目的:
/api/xxx),不用管后端服务名和端口;