AWS EKS中Nginx Ingress的微服务Swagger重定向配置问题
解决Nginx Ingress下Swagger根路径重定向404问题
你的问题核心是:访问服务根路径(如/customerservice)时,后端Swagger服务会重定向到/swagger/,但这个路径没有带上服务前缀,导致Ingress无法匹配到对应后端服务,从而返回404。下面是两种直接在Ingress层面解决的方案:
方案一:添加配置片段实现精准重定向
通过configuration-snippet注解,给每个服务根路径添加强制重定向规则,直接跳转到带服务前缀的swagger/index.html:
修改后的Ingress配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/configuration-snippet: | rewrite ^/customerservice$ /customerservice/swagger/index.html permanent; rewrite ^/customerservice/$ /customerservice/swagger/index.html permanent; rewrite ^/orderservice$ /orderservice/swagger/index.html permanent; rewrite ^/orderservice/$ /orderservice/swagger/index.html permanent; # 其他23个服务同理添加对应的rewrite规则 labels: app: trial-ingress name: trial-ingress spec: ingressClassName: nginx rules: - host: example.com http: paths: - backend: service: name: customerservice-svc port: number: 80 path: /customerservice(/|$)(.*) pathType: Prefix - backend: service: name: orderservice-svc port: number: 80 path: /orderservice(/|$)(.*) pathType: Prefix
这个方案直接在Ingress层面拦截根路径请求,强制跳转到正确的Swagger页面,无需修改后端服务配置。
方案二:添加单独的路径匹配规则
给每个服务的根路径单独添加一条Ingress路径,直接将请求rewrite到后端的/swagger/index.html:
修改后的Ingress配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/ssl-redirect: "false" labels: app: trial-ingress name: trial-ingress spec: ingressClassName: nginx rules: - host: example.com http: paths: # 处理customerservice根路径跳转 - backend: service: name: customerservice-svc port: number: 80 path: /customerservice(/?$) pathType: Prefix nginx.ingress.kubernetes.io/rewrite-target: /swagger/index.html # 处理customerservice API路径 - backend: service: name: customerservice-svc port: number: 80 path: /customerservice/(.*) pathType: Prefix nginx.ingress.kubernetes.io/rewrite-target: /$1 # orderservice同理配置 - backend: service: name: orderservice-svc port: number: 80 path: /orderservice(/?$) pathType: Prefix nginx.ingress.kubernetes.io/rewrite-target: /swagger/index.html - backend: service: name: orderservice-svc port: number: 80 path: /orderservice/(.*) pathType: Prefix nginx.ingress.kubernetes.io/rewrite-target: /$1
注意这个方案需要使用路径级别的rewrite-target注解,确保Ingress版本支持该特性。
额外提示
由于你有25个服务,手动编写规则会比较繁琐,建议用Kubernetes的Helm模板或Kustomize批量生成Ingress配置,减少重复劳动。
内容的提问来源于stack exchange,提问作者Sammy
相关产品推荐
相关产品推荐

