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
相关产品推荐
相关产品推荐

