基于路径通过Nginx Ingress路由至K8s服务的问题排查
问题分析与解决方案
你的判断是对的:当访问/test时,Nginx Ingress默认会把完整路径/test转发给httpd容器,而httpd的默认页面仅存在于根路径/下,因此返回404错误。你尝试的rewrite规则未生效,核心问题有两个:
- pathType与正则路径不兼容:你使用了正则格式的path,但指定了
pathType: Prefix——这个类型是为前缀匹配设计的,和正则匹配逻辑冲突,导致rewrite规则未被正确应用。 - 正则分组与rewrite目标不匹配:你编写的
/test(/|$)(.*)正则中,$2对应第二个分组(.*),但访问/test时该分组为空;若访问/test/xxx,$2为xxx,但httpd本身没有对应路径,仍会返回404。
修复后的Ingress配置
调整pathType并简化rewrite规则,让/和/test路径均能返回"It works!":
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-server-ingress namespace: web annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: somehost.com http: paths: - path: / pathType: Prefix backend: service: name: web-server-service port: number: 5000 - path: /test(/.*)? pathType: ImplementationSpecific backend: service: name: web-server-service port: number: 5000
配置说明
pathType: ImplementationSpecific:让Nginx Ingress控制器按照自身逻辑处理路径匹配,兼容正则表达式。path: /test(/.*)?:匹配/test及所有以/test/开头的路径。rewrite-target: /:直接将所有匹配路径重写为httpd的根路径,确保返回默认的"It works!"页面。
内容的提问来源于stack exchange,提问作者Gene Smith
相关产品推荐
相关产品推荐

