如何正确实施 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)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章