Kubernetes Nginx Ingress rewrite-target引发双斜杠问题求助
解决Kubernetes Ingress中/front路径重写的双斜杠问题
问题根因
你当前的Ingress配置里,/front()(.*)这个正则会把请求路径拆成两个分组:第一个分组是空字符串,第二个分组是/main/dashboard/3。配合rewrite-target: /$1$2的话,就会拼接成/ + 空 + /main/dashboard/3,结果就出现了双斜杠//main/dashboard/3。
修正后的配置方案
下面两种配置都能解决问题,选一种即可:
方案一:使用path级别的rewrite规则(Kubernetes 1.20+支持)
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-ingress annotations: nginx.ingress.kubernetes.io/use-regex: "true" spec: rules: - http: paths: # 处理/front开头的请求,移除前缀/front - path: /front(/.*) pathType: ImplementationSpecific backend: service: name: foo-service port: number: 8080 rewrite: target: $1 # 处理/back开头的请求,保留原路径 - path: /back(/.*) pathType: ImplementationSpecific backend: service: name: foo-service port: number: 8080 rewrite: target: /back$1
方案二:使用全局rewrite-target注解
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-ingress annotations: nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: $1 spec: rules: - http: paths: # 捕获/front后的整个路径,重写为该路径 - path: /front(/.*) pathType: ImplementationSpecific backend: service: name: foo-service port: number: 8080 # 捕获整个/back开头的路径,直接重写为该路径 - path: (/back/.*) pathType: ImplementationSpecific backend: service: name: foo-service port: number: 8080
验证效果
应用配置后测试:
kubectl apply -f demo-ingress.yaml && curl 192.168.49.2:80/front/main/dashboard/3
预期响应:
HTTP/1.1 GET /main/dashboard/3
测试back路径:
curl 192.168.49.2:80/back/main/dashboard/3
预期响应:
HTTP/1.1 GET /back/main/dashboard/3
核心逻辑说明
- 针对
/front路径,用/front(/.*)的正则直接捕获/main/dashboard/3作为分组$1,重写目标设为$1就避免了额外的斜杠 - 针对
/back路径,要么捕获完整的/back/...路径作为分组,要么直接匹配路径不做重写,确保原路径完整传递
内容的提问来源于stack exchange,提问作者Alef Duarte
相关产品推荐
相关产品推荐

