CORS规则Nginx入口规则

时间:2018-08-08 10:35:15

标签: kubernetes cors kubernetes-ingress

在nginx-ingress版本1.7.1上,我需要允许来自多个来源的请求:http://localhost:4200http://localhost:4242等。但是我无法针对多个来源执行此操作,因为nginx.ingress.kubernetes.io/cors-allow-credentials: true无法与nginx.ingress.kubernetes.io/cors-allow-origin: "*"一起使用。这会导致浏览器生成CORS错误。也许有人有避免这种错误的解决方案?

这是我的配置

 annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS, DELETE"
nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,X-CustomHeader,X-LANG,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,X-Api-Key,X-Device-Id,Access-Control-Allow-Origin"
  

从“ https://stage.site.com/api/session”访问XMLHttpRequest   原产地“ http://localhost:4200”已被CORS政策禁止:   响应中“ Access-Control-Allow-Origin”标头的值必须   当请求的凭据模式为时,不是通配符“ *”   '包括'。发起的请求的凭据模式   XMLHttpRequest由withCredentials属性控制。

3 个答案:

答案 0 :(得分:2)

添加注释以启用CORS

nginx.ingress.kubernetes.io/enable-cors: "true"

请注意,字符串“ *”不能用于支持凭据的资源https://www.w3.org/TR/cors/#resource-requests),请尝试使用域列表(逗号分隔)而不是*

答案 1 :(得分:2)

这是一个相当受欢迎的功能:https://github.com/kubernetes/ingress-nginx/issues/5496

作为当前的解决方法,您可以使用以下代码段为 CORS 定义多个域:https://github.com/kubernetes/ingress-nginx/issues/5496#issuecomment-662798662

已提交 PR 并等待完成。因此,这应该在即将发布的版本之一中本地推出:https://github.com/kubernetes/ingress-nginx/pull/7134

答案 2 :(得分:1)

您可以创建另一个Ingress,该Ingress具有不同的域和cors起点,并指向相同的目的地。不是最好的解决方案,但它可以工作。

或者:

        kubernetes.io/ingress.class: nginx
        nginx.ingress.kubernetes.io/configuration-snippet: |
           more_set_headers "Access-Control-Allow-Origin: $http_origin";
        nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
        nginx.ingress.kubernetes.io/cors-allow-methods: PUT, GET, POST, 
           OPTIONS, DELETE, PATCH
        nginx.ingress.kubernetes.io/enable-cors: "true"

但是注意$ http_origin允许每个来源!