Kubernetes Ingress资源路径无法正确传递至后端服务求助
问题原因
当前配置里的nginx.ingress.kubernetes.io/rewrite-target: /会把所有匹配/api/user-management/前缀的请求,直接重写到后端服务的根路径/,完全丢弃了/api/user-management/之后的路径内容,所以不管访问/api/user-management/test还是其他子路径,后端收到的都是/请求。
解决方案
用Nginx Ingress的正则捕获组功能,保留路径的剩余部分并传递给后端服务。修改后的Ingress配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: user-management-ingress annotations: # 通过捕获组保留路径后缀,$2对应第二个捕获组的内容 nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: ingressClassName: nginx rules: - http: paths: - path: / pathType: Prefix backend: service: name: react-frontend port: number: 80 # 正则匹配:捕获/api/user-management/之后的所有路径内容 - path: /api/user-management(/|$)(.*) pathType: ImplementationSpecific backend: service: name: user-management port: number: 80
配置说明
- 路径正则:
/api/user-management(/|$)(.*)(/|$):匹配路径末尾的斜杠或路径结束,避免误匹配类似/api/user-management-other的路径(.*):捕获/api/user-management/之后的所有内容,对应rewrite-target中的$2
- rewrite-target:
/$2会把捕获到的路径后缀拼接到后端服务的根路径后,比如访问/api/user-management/test,后端收到的请求路径是/test - pathType:设置为
ImplementationSpecific,因为使用了正则表达式,Kubernetes原生的Prefix或Exact类型不支持正则语法,需要交给Nginx Ingress Controller处理匹配逻辑
验证步骤
- 应用修改后的Ingress配置:
kubectl apply -f your-ingress-file.yaml - 等待Ingress Controller更新配置后,测试访问:
此时后端服务应能正确接收curl http://your-domain/api/user-management/test/test路径的请求
其他注意事项
- 确保Nginx Ingress Controller版本在v0.22.0及以上,该版本开始支持正则捕获组功能
- 如果后端服务期望接收完整的
/api/user-management/test路径,可以把rewrite-target调整为/api/user-management/$2,根据实际需求修改
内容的提问来源于stack exchange,提问作者Emtrixx
相关产品推荐
相关产品推荐

