【发布时间】: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