nginx-ingress配置rewrite-target后/api路径访问异常如何解决?
问题原因分析
- 未添加
rewrite-target注解时,Ingress会将原始请求路径完整透传给后端服务,你访问dev.example.com/api/check_version时,后端Ruby服务收到的请求路径为/api/check_version,和服务本身定义的/check_version路由不匹配,所以报错。 - 添加
nginx.ingress.kubernetes.io/rewrite-target: /注解后,所有匹配/api前缀的请求都会被重写为根路径/透传给后端,此时访问/api/check_version后端收到的路径是/,自然也没有匹配的路由。
正确配置方案
你需要使用Ingress Nginx的rewrite规则捕获/api前缀后的路径,重写后透传给后端,完整配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-dev annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: 'dev.example.com' http: paths: - path: /api(/|$)(.*) pathType: ImplementationSpecific backend: service: name: my-ruby port: number: 3000
配置说明
- 路径规则
/api(/|$)(.*)中的第二个括号为捕获组,会匹配/api后面的所有路径内容,对应占位符$2 - 重写规则
/$2会将捕获到的实际路径拼接为最终转发路径:请求/api/check_version时,$2取值为check_version,转发到后端的路径为/check_version,和服务路由匹配 - pathType设置为
ImplementationSpecific,适配正则形式的路径匹配规则 - 如果你需要保留
/api前缀转发,只需要给后端服务的路由统一加上/api前缀即可,不需要添加rewrite相关注解
内容的提问来源于stack exchange,提问作者Swarovsky
相关产品推荐
相关产品推荐

