如何配置Nginx Ingress解决K8s多应用重定向路径丢失问题
解决K8s Nginx Ingress下应用重定向丢失上下文的问题
问题根源
你的应用在重定向时返回的是根路径(如/link1)或内部服务地址(如http://app2-k8s-svc:9090/link1),现有Ingress配置仅处理了请求路径的重写,未修改响应中的Location头,导致浏览器跳转到localhost/link1而非预期的localhost/app2/link1。
解决方案
修改Ingress配置,添加注解处理重定向响应的Location头,同时移除无效的add-base-url注解(该注解需应用配合读取环境变量,你无法修改应用配置故无用)。
修改后的Ingress配置
--- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress annotations: nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: /$2 # 替换应用返回的内部服务地址重定向 nginx.ingress.kubernetes.io/proxy-redirect-from: http://app1-k8s-svc:80/ nginx.ingress.kubernetes.io/proxy-redirect-to: /app1/ nginx.ingress.kubernetes.io/proxy-redirect-from: http://app2-k8s-svc:9090/ nginx.ingress.kubernetes.io/proxy-redirect-to: /app2/ # 替换应用返回的根路径开头的重定向 nginx.ingress.kubernetes.io/configuration-snippet: | if ($request_uri ~* ^/app1(/|$)) { proxy_redirect ~^/(.*) /app1/$1; } if ($request_uri ~* ^/app2(/|$)) { proxy_redirect ~^/(.*) /app2/$1; } spec: ingressClassName: nginx rules: - http: paths: - path: /app1(/|$)(.*) pathType: Prefix backend: service: name: "app1-k8s-svc" port: number: 80 - path: /app2(/|$)(.*) pathType: Prefix backend: service: name: "app2-k8s-svc" port: number: 9090
配置说明
proxy-redirect-from/to:匹配应用返回的带内部服务域名的Location值,将其替换为对应应用的上下文前缀(如把http://app2-k8s-svc:9090/link1替换为/app2/link1)。configuration-snippet:通过自定义Nginx规则,根据当前请求的上下文路径,将应用返回的根路径开头的Location(如/link1)替换为带前缀的路径(如/app2/link1),确保重定向始终落在对应应用的上下文下。
内容的提问来源于stack exchange,提问作者Mohamed Javeed
相关产品推荐
相关产品推荐

