Kubernetes Nginx Ingress路径重写规则不生效404错误排查
问题根因
你遇到的问题核心是Ingress的pathType配置与路径正则规则不匹配:
networking.k8s.io/v1版本的Ingress规范中,pathType: Prefix仅做普通前缀字符串匹配,不会识别路径中的正则表达式语法,因此Nginx Ingress控制器不会为该路径生成带正则修饰符~*的location规则,你看到生成的location /online(/|$)/(.*) {就是纯字符串匹配,自然无法匹配/online/userOnline请求。- 未匹配到自定义规则的请求落到了不存在的默认后端,Nginx就会尝试读取自身静态资源目录下的文件,因此日志中会出现
open() "/etc/nginx/html/online/userOnline" failed的报错。
修复方案
按以下要求修改Ingress YAML配置即可:
- 将正则路径的
pathType从Prefix改为ImplementationSpecific,该类型是Nginx Ingress控制器专门用于支持正则路径匹配的类型,只有配置为该值时控制器才会解析路径中的正则语法,生成带~*修饰符的location规则。 - 修正路径写法,你原路径
/online(/|$)/(.*)多了冗余的斜杠,会导致匹配逻辑异常,调整为/online(/|$)(.*)即可适配/online、/online/xxx两类请求。 - 保持
rewrite-target: /$2不变,会自动把正则捕获到的第二段内容作为重写后的路径。
修正后完整YAML示例
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: online-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: ingressClassName: nginx rules: - host: jj.cloud.com http: paths: - path: /online(/|$)(.*) pathType: ImplementationSpecific backend: service: name: online port: number: 80 - path: /userOnline pathType: Prefix backend: service: name: online port: number: 80
验证
部署修改后的Ingress后,再次查看生成的Nginx配置,就会看到符合预期的正则location规则:
location ~* "^/online(/|$)(.*)" {
此时访问/online/userOnline就会被正确重写为/userOnline转发到后端服务,返回正常响应。
内容的提问来源于stack exchange,提问作者tanxin
相关产品推荐
相关产品推荐

