如何使用Nginx Ingress实现无重定向的URL内容代理
Nginx Ingress 无重定向URL代理配置解决方案
问题分析
你当前的配置未生效,核心原因通常有两个:
- 后端返回的页面中存在硬编码的
/spots/路径(如CSS/JS引用、内部链接),浏览器会基于地址栏的/all-spots请求/all-spots/spots/xxx,导致资源加载失败,看起来配置没起作用; - 缺少必要的请求头设置和重定向控制,后端可能返回跳转响应,或无法正确识别请求来源。
正确配置方案
方案一:完整配置(处理页面路径硬编码场景)
直接在K8s Ingress资源中通过注解添加自定义Nginx规则,同时解决页面内资源路径问题:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-spots-ingress annotations: nginx.ingress.kubernetes.io/server-snippet: | location ~ ^/all-spots(/.*)?$ { # 重写请求路径,将/all-spots开头的请求转发到/spots路径 rewrite ^/all-spots(/.*)?$ /spots$1 break; # 代理到后端服务 proxy_pass http://spots.ecom.svc.cluster.local; # 传递正确主机头,避免后端返回基于自身域名的重定向 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 禁止Nginx修改后端返回的重定向响应 proxy_redirect off; # 替换页面中硬编码的/spots/路径为/all-spots/,修复资源加载 sub_filter '/spots/' '/all-spots/'; sub_filter_once off; } spec: rules: - host: www.example.com http: paths: # 保留原spots路径的正常访问 - path: /spots pathType: Prefix backend: service: name: spots-service port: number: 80 # 配置all-spots路径的代理规则 - path: /all-spots pathType: Prefix backend: service: name: spots-service port: number: 80
方案二:简化配置(页面无硬编码路径场景)
如果后端页面全部使用相对路径,没有硬编码的/spots/引用,可以使用简化版配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-spots-ingress annotations: nginx.ingress.kubernetes.io/configuration-snippet: | rewrite ^/all-spots(.*)$ /spots$1 last; spec: rules: - host: www.example.com http: paths: - path: /spots pathType: Prefix backend: service: name: spots-service port: number: 80 - path: /all-spots pathType: Prefix backend: service: name: spots-service port: number: 80
关键配置说明
rewrite ^/all-spots(/.*)?$ /spots$1 break:精准匹配/all-spots及所有子路径,重写为/spots开头的路径,break表示停止后续rewrite规则,直接执行代理;proxy_set_header Host $host:确保后端服务收到的请求主机头为www.example.com,避免后端返回基于自身服务域名的重定向;sub_filter:核心解决页面内资源路径问题,将后端返回内容中的/spots/替换为/all-spots/,保证浏览器请求资源时使用正确路径;proxy_redirect off:禁止Nginx自动修改后端返回的Location头,防止地址栏被强制跳转。
内容的提问来源于stack exchange,提问作者user2693302
相关产品推荐
相关产品推荐

