Ingress 配了 rewrite-target,后端 access log 里收到的路径是 /orders,前端请求的却是 /api/orders,接口全 404。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

kubectl describe ingress api-ingress | grep -A6 Rules
kubectl logs -n ingress-nginx deploy/ingress-nginx-controller | grep rewrite
curl -sv http://api.example.com/api/orders

rewrite-target 会把捕获组之外的前缀整段替换掉,path 写成 /api(/|$)(.*) 时第二组才是要保留的部分。pathType 用 Prefix 时不会自动补斜杠。这一点先确认清楚,后面就不用反复试。

「Ingress 路径重写」这类改动最怕改一半,回滚脚本先准备好,再动生产。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。

改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。

具体做法是,打开 ingress-nginx 的 rewrite 日志 确认重写前后的 URI;用 use-regex 注解并显式写捕获组;rewrite-target 写成 /$2 保留业务路径;用 curl -v 对比入口和 Pod 日志里的 path。

改完照着核一遍,Pod 日志里的请求路径变回 /api/orders 接口返回 200 而不是 404。

作者 9823189