如何正确实施 CORS(Access-Control-Allow-Origin)? [复制]

Posted

技术标签:

【中文标题】如何正确实施 CORS(Access-Control-Allow-Origin)? [复制]【英文标题】:How to implement CORS (Access-Control-Allow-Origin) correctly? [duplicate] 【发布时间】:2015-01-15 18:24:42 【问题描述】:

我想通过 XML HTTP 请求(XHR、AJAX)访问第三方资源(在另一个域上)。

我将 CORS 设置如下(在两侧 - 目标和原点):

Access-Control-Allow-Origin: http://www.example.com, https://www.example.com, http://www.example.org, https://www.example.org
Access-Control-Allow-Methods: GET, POST, HEAD, OPTIONS

Chrome、Firefox 和 Internet Explorer 在 http://www.example.com/bar 上调用 XHR 时拒绝 https://www.example.org/foo。

最详细的错误信息来自 Firefox:

XMLHttpRequest 无法加载 https://www.example.org/foo。 “Access-Control-Allow-Origin”标头包含多个值“http://www.example.com、https://www.example.com、http://www.example.org、https://www.example.org”,但只允许一个值。因此,Origin 'http://www.example.com' 不允许访问。

这个错误让我非常困惑。这就像“嘿,你是 A,想和 B 说话,但 B 只接受 A、B。所以你不能和 B 说话”。什么鬼?

如何正确实现CORS(Access-Control-Allow-Origin)?

【问题讨论】:

您的资源使用哪种服务器端语言? (ajax 调用的服务) @Pete:双方都是纯静态 html 文件。 啊,我的 MVC 服务出现了这个问题,我不得不将多个域的 Access-Control-Allow-Origin 更改为 *,然后在处理数据后只进行域检查,但因为你的是纯 html我不确定您将如何允许多个域 Access-Control-Allow-Origin: * 不受 Firefox 支持。 Firefox 需要精确匹配的来源。见:webdavsystem.com/ajax/programming/cross_origin_requests @Pete 该站点意味着 Firefox 使用时 Access-Control-Allow-Credentials: true(即spec-required behavior)不支持Access-Control-Allow-Origin: *。这并不意味着 * 通常被 Firefox 禁止作为允许的 CORS 来源。 (该网站特别介绍了如何为 WebDAV 设置 CORS,这需要有凭据的请求。)您通常可以安全地继续使用 Access-Control-Allow-Origin: * 【参考方案1】:

Access-Control-Allow-Origin 仅接受 *单个来源。

如果您想支持多个来源但不是全部,那么您必须:

    看the Origin request header 检查它是否在您的可接受来源列表中 放在Access-Control-Allow-Origin响应头中

【讨论】:

你说的是由服务器即时生成Access-Control-Allow-Origin

以上是关于如何正确实施 CORS(Access-Control-Allow-Origin)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Laravel 5 中为特定路线添加 CORS

AWS S3:CORS 配置未实施 [关闭]

如何正确设置 CORS 以将带有 presignedUrl 的文件上传到 Firebase 存储?

如何解决 HTTP 状态的 CORS 策略不正确?

Zscaler 的 Ajax 问题

如何正确设置 GET/POST 获取的标头以避免 CORS