K8s Nginx Ingress URI重写配置异常求助
问题分析与解决方案
核心问题
你的404错误源于两个关键配置错误:
- 不必要且配置错误的重写规则:你添加了
nginx.ingress.kubernetes.io/rewrite-target: /$1注解,但路径(path)未设置正则捕获组,导致$1为空值。当请求/bar或/sos时,NGINX会将路径重写为/转发给后端服务,而服务B、C的有效资源在/bar、/sos路径,根路径/无对应资源,因此返回404。 - 注解混用:你同时使用了两类不兼容的Ingress注解——官方
kubernetes/ingress-nginx(你部署的helm chart对应的控制器)使用nginx.ingress.kubernetes.io/前缀,而nginx.org/属于NGINX Inc的Ingress Controller注解,混用可能导致部分配置失效。
修正后的配置
移除不必要的重写注解,统一使用官方注解,并调整路径顺序(确保最长路径优先匹配,避免歧义):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/proxy-ssl-verify: "false" nginx.ingress.kubernetes.io/proxy-body-size: 1024m nginx.ingress.kubernetes.io/proxy-connect-timeout: "350" nginx.ingress.kubernetes.io/proxy-read-timeout: "4260" name: service-A-ingress spec: ingressClassName: nginx rules: - host: test-api.foo.com http: paths: - backend: service: name: Service-B port: number: 3002 path: /bar pathType: Prefix - backend: service: name: Service-C port: number: 3003 path: /sos pathType: Prefix - backend: service: name: service-A port: number: 3001 path: / pathType: Prefix
关键调整说明
- 移除重写注解:你的需求是路径完全透传(请求路径与后端服务路径一致),无需重写,因此删除
rewrite-target注解即可让NGINX原样转发请求路径。 - 替换注解前缀:
nginx.org/client-max-body-size→nginx.ingress.kubernetes.io/proxy-body-sizenginx.org/proxy-connect-timeout→nginx.ingress.kubernetes.io/proxy-connect-timeout(值不需要带s后缀,仅保留数字)nginx.org/proxy-read-timeout→nginx.ingress.kubernetes.io/proxy-read-timeout(同理去掉s后缀)
- 调整路径顺序:将
/bar、/sos这类更长的前缀路径放在/前面,确保NGINX优先匹配具体路径,避免所有请求都被根路径拦截(官方ingress-nginx支持最长前缀匹配,但显式调整顺序更稳妥)。 - 修改pathType:使用
Prefix类型替代ImplementationSpecific,更清晰地表明是前缀匹配规则,符合你的需求场景。
内容的提问来源于stack exchange,提问作者Ketul Radadiya
相关产品推荐
相关产品推荐

