Nginx Ingress /api路径转发至后端服务/api而非根路径问题求助
问题根因
Nginx Ingress 默认会将请求携带的完整路径透传给后端Service,你当前配置的/api前缀匹配规则下,http://example.com/api/xxx会直接转发到api-service的/api/xxx路径,符合默认转发逻辑。
解决方案
方案1:使用rewrite注解移除前缀(最常用,适配现有单Ingress配置场景)
你只需要在Ingress的metadata.annotations中添加重写规则,同时调整/api的路径匹配规则即可,修改后的完整配置如下:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-client annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/rewrite-target: /$2 namespace: dev spec: rules: - host: example.com http: paths: - path: / pathType: Prefix backend: service: name: client-service port: number: 80 - path: /api(/|$)(.*) pathType: Prefix backend: service: name: api-service port: number: 80规则说明:路径正则
/api(/|$)(.*)中的$2会匹配/api后面的所有路径内容,重写目标/$2会直接丢弃/api前缀,比如请求http://example.com/api会转发到api-service的/路径,请求http://example.com/api/user会转发到api-service的/user路径。方案2:拆分独立Ingress资源(适合多路径转发规则差异大的场景)
如果你不想让重写规则影响Ingress下的其他路径配置,可以把/api相关的路由拆成单独的Ingress资源,仅给这个资源添加重写注解即可,不会干扰现有/client相关的转发逻辑。
配置验证
更新配置后可以直接发请求验证:curl http://example.com/api
查看api-service的访问日志,确认请求路径为根路径即可。
内容的提问来源于stack exchange,提问作者Ali Mehdi
相关产品推荐
相关产品推荐

