Nginx Ingress Controller修改路径前缀后路由失效、重定向错误问题求助
解决方案
你遇到的是后端服务返回的重定向路径未携带Ingress前缀的典型场景,不需要修改业务代码,通过Nginx Ingress的注解配置即可解决,以下是两种可行方案:
方案1:无需修改应用,通过Nginx自动修正重定向路径
该方案适合无法调整应用配置的场景,通过Ingress的代理重定向规则自动给所有后端返回的重定向路径加上/sub前缀,完整Ingress配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myapp-ingress namespace: mynamespace annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt # 原有重写规则,实现/sub路径转发到后端根路径 nginx.ingress.kubernetes.io/rewrite-target: /$2 # 自动修正后端返回的重定向路径,加上/sub前缀 nginx.ingress.kubernetes.io/proxy-redirect: ~^/(.*) /sub/$1 spec: tls: - hosts: - <myapp>.<myregion>.cloudapp.azure.com secretName: tls-secret rules: - host: <myapp>.<myregion>.cloudapp.azure.com http: paths: - path: /sub(/|$)(.*) pathType: Prefix backend: service: name: myapp-service port: number: 80
配置说明:
path: /sub(/|$)(.*)配合rewrite-target: /$2,实现/sub、/sub/login这类路径统一重写为/、/login传递给后端服务,和你之前的重写逻辑完全一致。proxy-redirect注解会自动拦截后端返回的3xx响应,将响应头中Location字段的根路径前缀替换为/sub/,比如后端返回/login会被自动修改为/sub/login再返回给浏览器。
方案2:通过标准请求头让应用自动生成带前缀的路径(推荐)
如果你的应用使用的Web框架支持识别X-Forwarded-Prefix标准请求头(绝大多数主流框架如Spring Boot、Django、Express、Next.js等都支持),优先选择该方案,兼容性更好,还能解决静态资源路径错误的衍生问题:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: myapp-ingress namespace: mynamespace annotations: kubernetes.io/ingress.class: nginx cert-manager.io/cluster-issuer: letsencrypt nginx.ingress.kubernetes.io/rewrite-target: /$2 # 给请求加上X-Forwarded-Prefix头,告知应用对外暴露的前缀是/sub nginx.ingress.kubernetes.io/x-forwarded-prefix: "/sub" spec: tls: - hosts: - <myapp>.<myregion>.cloudapp.azure.com secretName: tls-secret rules: - host: <myapp>.<myregion>.cloudapp.azure.com http: paths: - path: /sub(/|$)(.*) pathType: Prefix backend: service: name: myapp-service port: number: 80
配置说明:
开启该配置后,应用在生成重定向、静态资源引用路径时,会自动拼接/sub前缀,从根源上避免路径缺失的问题,不需要Nginx额外修改重定向响应。
内容的提问来源于stack exchange,提问作者Franco Tiveron
相关产品推荐
相关产品推荐

