You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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配置即可:

  1. 将正则路径的pathType从Prefix改为ImplementationSpecific,该类型是Nginx Ingress控制器专门用于支持正则路径匹配的类型,只有配置为该值时控制器才会解析路径中的正则语法,生成带~*修饰符的location规则。
  2. 修正路径写法,你原路径/online(/|$)/(.*)多了冗余的斜杠,会导致匹配逻辑异常,调整为/online(/|$)(.*)即可适配/online、/online/xxx两类请求。
  3. 保持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:45:04