【问题标题】:XmlHttpRequest denied by Access-Control-Allow-Origin even though origin matches perfectlyXmlHttpRequest 被 Access-Control-Allow-Origin 拒绝,即使来源完全匹配
【发布时间】:2012-11-14 10:24:01
【问题描述】:

生命体征:

Chrome 版本 23.0.1271.64 Mac OS X 10.8.2

情况:

我在https://api.myapi.com/ 上公开了一个 Web 服务... 我想允许 JavaScript 应用程序与这个 API 交互。 CORS 感觉显然是最合适的(jsonp 和朋友是可怕的,可怕的黑客)。

我可以在我的开发者工具中看到预检请求正在发出:

Request URL: https://api.myapi.com/someapi
Request Method: OPTIONS
Status Code: 200 OK

Request Headers

Accept: */*
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Access-Control-Request-Headers: origin, authorization, accept
Access-Control-Request-Method: GET
Connection: keep-alive
Host: api.myapi.com
Origin: http://prototypes.mycompany.com
Referer: http://prototypes.mycompany.com/somepage.html
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11

Response Headers

Access-Control-Allow-Headers: Accept,Authorization,Content-Length,Content-Type,Cookie
Access-Control-Allow-Methods: GET,POST,PUT,DELETE,HEAD,OPTIONS
Access-Control-Allow-Origin: http://prototypes.mycompany.com
Access-Control-Allow-Credentials: true
Connection: close

这看起来很棒,尤其是响应 Access-Control-Allow-Origin 标头似乎与请求 Origin 标头精确匹配。

紧接着,实际的请求被尝试:

Request URL: https://api.myapi.com/someapi

Request Headers

Accept: application/json, text/javascript, */*; q=0.01
Authorization: <custom authentication scheme, removed>
Origin: http://prototypes.mycompany.com
Referer: http://prototypes.mycompany.com/somepage.html
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11

然后显示为“已取消”并发出以下错误:

XMLHttpRequest 无法加载 https://api.myapi.com/someapi。 Access-Control-Allow-Origin 不允许来源http://prototypes.mycompany.com

我最初以 * 作为我的允许来源,但由于完全相同的问题而失败。

我已经在 iOS 5 的 Mobile Safari 和 Firefox 上复制了这个问题。在 Firefox 中,这种行为更加令人困惑: 服务器响应 200 OK 然后 6-7KB 的数据(这是我所期望的)。客户端日志说它得到了 200 OK 和大约 300 字节的数据(没有响应标头,根本没有响应......),然后触发“错误”处理程序。

我错过了什么?

【问题讨论】:

    标签: javascript http cors


    【解决方案1】:

    问题解决了!我不得不打破 gdb 来解决这个问题......

    代理服务器将其自己的 CORS 标头插入到请求中。因此,HTTP 会话多次指定了标头。安全检查正在检查第一个标头“*”,并导致请求失败。请求失败打印出 last 标头值,看起来是正确的。

    不是很有帮助,WebKit!

    【讨论】:

      【解决方案2】:

      想法:

      • 我注意到您的 Access-Control-Allow-Headers 中没有 Origin。我不认为他们是必要的,但你有Content-Length,我也不认为这是必要的。

      • 你正在使用Authorization,你认为你应该使用credentials吗? (显然有时您应该在回复中包含Access-Control-Allow-Credentials: true。)

      (这些几乎不值得一个“答案”,但愚蠢的 cmets 不允许换行。)

      【讨论】:

      • 自从我发布问题后,我添加了Access-Control-Allow-Credentials,但没有任何效果。我将添加Origin,但我认为这不是问题——错误消息不会报告指定的标头无效吗?
      猜你喜欢
      • 2015-04-08
      • 2019-10-10
      • 2016-04-26
      • 2012-09-28
      • 2014-03-05
      • 2019-06-06
      • 2013-02-05
      • 2011-10-27
      相关资源
      最近更新 更多