如何在Nginx Ingress中实现域名到后端的URL重写?
实现方案及正确Ingress配置
完全可以实现你要的需求,之前的配置失效主要是因为没开启正则匹配,且路径与重写规则的变量对应有误。以下是正确的配置方案:
完整Ingress配置
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: customer-shop-ingress namespace: shop annotations: kubernetes.io/ingress.class: "nginx" # 开启正则路径匹配,这是正则生效的关键 nginx.ingress.kubernetes.io/use-regex: "true" spec: rules: # 处理example.com的请求,转发至shop-service的/11111路径下 - host: example.com http: paths: - path: /(.*) # 正则路径需使用该类型,让Ingress控制器自行处理匹配逻辑 pathType: ImplementationSpecific backend: service: name: shop-service port: number: 80 # 重写规则:将请求路径替换为/11111 + 捕获到的路径部分 nginx.ingress.kubernetes.io/rewrite-target: /11111/$1 # 处理other-example.com的请求,转发至shop-service的/22222路径下 - host: other-example.com http: paths: - path: /(.*) pathType: ImplementationSpecific backend: service: name: shop-service port: number: 80 nginx.ingress.kubernetes.io/rewrite-target: /22222/$1
关键配置说明
- 开启正则匹配:必须添加
nginx.ingress.kubernetes.io/use-regex: "true"注解,否则Ingress不会解析路径中的正则表达式。 - 路径匹配规则:
path: /(.*)会匹配域名下所有请求路径,(.*)会捕获根路径(空字符串)或后续的路径部分。 - 重写规则:
rewrite-target: /11111/$1会把捕获到的路径部分追加到/11111后,实现:http://example.com→shop-service/11111http://example.com/path/bar→shop-service/11111/path/bar
- 路径类型:正则路径不能使用
Prefix或Exact,必须指定pathType: ImplementationSpecific。
验证步骤
- 应用配置:
kubectl apply -f <你的Ingress配置文件>.yaml -n shop - 检查Ingress状态:
kubectl describe ingress customer-shop-ingress -n shop,确认规则已正确加载 - 测试请求:用curl或浏览器访问example.com,验证是否正确转发到对应路径
内容的提问来源于stack exchange,提问作者user1167253
相关产品推荐
相关产品推荐

