k8s中traefik配置跨域策略
「我们都知道在控制跨域策略的时候一般通过修改http response header来实现。在traefik中我们可以通过middleware来实现对http response header的控制,并将middleware关联到我们的路由中,当外部的请求和我们的路由进行匹配时,就会执行我们提前定义好的中间件。」
1.创建控制跨域策略的middleware
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
name: test-cors
namespace: default
spec:
headers:
customResponseHeaders:
Access-Control-Allow-Origin: "http://soulchild.cn:8080"
Access-Control-Allow-Methods: "*"
Access-Control-Allow-Headers: "*"
# 下面设置会允许所有域名,不能限制住,不知道为什么,所以用了上面的方式.
#accessControlAllowMethods:
# - "*"
#accessControlAllowOriginList:
# - "http://soulchild.cn:8080"
#accessControlAllowHeaders:
# - "*"
#accessControlMaxAge: 100
#addVaryHeader: true
❝通过customResponseHeaders来自定义响应头,下面是几个响应头的含义。
❞
-
Access-Control-Allow-Origin 用来设置可以跨域的地址,格式scheme://hostname:port,当然port如果是80则可以忽略不写。 -
Access-Control-Allow-Methods 用来设置请求允许的方法,如GET、POST、PUT、OPTION,*代表所有 -
Access-Control-Allow-Headers 当浏览器请求包含自定义header字段时,用来设置允许的自定义header,
2.和路由关联
「这里说两种关联方式,一种是和ingress资源关联,另一种是ingressroute」
ingress
在ingress中添加annotations就可以关联了
traefik.ingress.kubernetes.io/router.middlewares: default-test-cors@kubernetescrd
ingressroute
在ingressroute.routes.下添加middlewares的信息即可,当然也可以定义多个中间件,最终会按照声明的顺序来执行
spec:
entryPoints:
- web
routes:
- kind: Rule
match: PathPrefix(`/api/xxx`)
middlewares:
- name: test-cors
namespace: default