CORS 规则 nginx-ingress 规则

Posted

技术标签:

【中文标题】CORS 规则 nginx-ingress 规则【英文标题】:CORS rules nginx-ingress rules 【发布时间】:2019-01-15 14:12:21 【问题描述】:

我需要在 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 属性控制。

【问题讨论】:

看来您需要通过在服务器端代码的不同部分设置 Access-Control-Allow-Origin 值来解决此问题。见github.com/kubernetes/ingress-nginx/issues/2535和github.com/kubernetes/ingress-nginx/issues/… 不——这也不行。 【参考方案1】:

添加注解启用CORS

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

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

【讨论】:

逗号分隔列表不起作用。 nginx.ingress.kubernetes.io/cors-allow-origin 只支持一个域,否则解析为 '*'。 github.com/kubernetes/ingress-nginx/issues/5496【参考方案2】:

您可以创建第二个 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 允许每个来源!

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于CORS 规则 nginx-ingress 规则的主要内容,如果未能解决你的问题,请参考以下文章

即使规则设置为 true,也可以用 firebase 反应 CORS 问题

CORS跨域请求规则以及在Spring中的实现

Firefox WebFont 403 尽管有 S3 CORS 规则

使用 <AllowedHeader>Authorization</AllowedHeader> CORS 规则将文件上传到存储桶

Azure 存储。得到 403 [url](未启用 CORS 或未找到此请求的匹配规则。)

Express路由路径匹配规则以及第三方包模块cors