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

Kubernetes Nginx Ingress 按路径重写转发规则配置问题求助

解决方案

原配置核心问题

  • 全局统一的rewrite-target规则无法同时匹配两种不同的路径重写逻辑:hangfire路径需要移除/api/foo前缀,其余/api/foo、/api/bar路径不需要修改原始路径
  • 未显式启用正则匹配,带(.*)的路径规则无法按预期生效
  • svc2的路径规则写法不严谨,无法覆盖/api/bar、/api/bar/xxx等所有符合要求的请求

推荐配置方案

按不同重写逻辑拆分两个Ingress资源,利用Nginx Ingress最长路径优先匹配的特性实现需求,逻辑清晰不易出错:

1. 处理svc1 hangfire路径的Ingress

单独配置重写规则,把/api/foo/hangfire/xxx格式的请求转发到svc1的/hangfire/xxx路径:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: svc1-hangfire-ingress
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /hangfire/$2
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /api/foo/hangfire(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: svc1
            port:
              number: 80

2. 处理剩余通用路径的Ingress

不需要配置重写规则,直接原样转发路径即可:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: common-service-ingress
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /api/foo
        pathType: Prefix
        backend:
          service:
            name: svc1
            port:
              number: 80
      - path: /api/bar
        pathType: Prefix
        backend:
          service:
            name: svc2
            port:
              number: 80

Helm Values 对应写法

如果你使用Helm管理应用,可以按如下格式调整values配置:

# 通用服务Ingress配置
ingress:
  enabled: true
  annotations: {}
  spec:
    rules:
    - host: example.com
      http:
        paths:
        - path: /api/foo
          pathType: Prefix
          backend:
            serviceName: svc1
            servicePort: 80
        - path: /api/bar
          pathType: Prefix
          backend:
            serviceName: svc2
            servicePort: 80
# Hangfire专用Ingress配置
hangfireIngress:
  enabled: true
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /hangfire/$2
  spec:
    rules:
    - host: example.com
      http:
        paths:
        - path: /api/foo/hangfire(/|$)(.*)
          pathType: Prefix
          backend:
            serviceName: svc1
            servicePort: 80

实现原理

  • Nginx Ingress默认优先匹配最长路径前缀,/api/foo/hangfire规则长度大于/api/foo,所以hangfire相关请求会优先触发单独的重写规则,不会被通用规则覆盖
  • 不需要重写的路径直接保留原始路径转发,符合/api/foo、/api/bar的转发要求
  • 正则捕获组(/|$)(.*)可以同时匹配路径末尾带斜杠、不带斜杠、带后续子路径的所有场景,避免漏匹配

内容的提问来源于stack exchange,提问作者Chris L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:30:00