Kubernetes集群中Traefik Ingress控制器修改响应头方法问询
嘿,这个需求我刚好折腾过!既然你已经在用Traefik处理请求路径的重写,那修改响应头里的/tre相关路径完全可以用Traefik自带的功能搞定,分两种场景给你说:
如果你用的是Traefik v2+(推荐方案)
Traefik v2之后引入了Middleware的概念,这是处理这类请求/响应修改的标准方式,灵活度拉满。
第一步:创建修改响应头的Middleware
比如你要把响应头里所有/tre开头的路径替换成/star(比如后端返回的Location头、Content-Location头等),可以创建一个HeadersRegexReplace类型的Middleware:
apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: rewrite-response-path-headers spec: headersRegexReplace: # 匹配所有以/tre开头的路径 regex: ^/tre(.*)$ # 替换成/star开头,保留后面的路径部分 replacement: /star$1 # 指定要修改的响应头列表,根据你的实际需求添加 headers: - Location - Content-Location # 其他包含路径的响应头都可以加在这里
第二步:把Middleware挂到你的Ingress上
另外提一句:Traefik v2里已经不推荐用ingress.kubernetes.io/rewrite-target注解了,官方更推荐用ReplacePathRegex Middleware来处理请求路径重写。所以你可以把原来的路径重写也改成Middleware,然后和响应头修改的Middleware一起绑定:
# 先创建请求路径重写的Middleware apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: rewrite-request-path spec: replacePathRegex: regex: ^/star(.*)$ replacement: /trek$1 # 然后修改你的Ingress,关联两个Middleware apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: your-app-ingress annotations: # 格式:命名空间-Middleware名称@kubernetescrd,多个用逗号分隔 traefik.ingress.kubernetes.io/router.middlewares: default-rewrite-request-path@kubernetescrd,default-rewrite-response-path-headers@kubernetescrd spec: rules: - host: your-domain.example.com http: paths: - path: /star pathType: Prefix backend: service: name: your-backend-service port: number: 80
额外:如果需要修改响应体里的路径
要是后端返回的HTML、JSON等响应体里也有/tre开头的路径需要替换,再加一个BodyRegexReplace Middleware就行:
apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: rewrite-response-body spec: bodyRegexReplace: regex: /tre(.*?) replacement: /star$1
把它也加到Ingress的router.middlewares列表里就搞定了。
如果你还在使用Traefik v1
Traefik v1的功能相对有限,没有专门的响应头正则替换Middleware,硬要实现的话只能通过自定义Traefik配置或者加Sidecar容器(比如nginx)代理后端响应来做,但这两种方式都比较折腾,不如直接升级到v2来得省心——毕竟v2的Middleware生态已经很成熟了,能解决绝大多数这类场景的问题。
内容的提问来源于stack exchange,提问作者Varunkumar Manohar

