首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XmlHttpRequest被访问控制-允许-原产地拒绝,即使原点完全匹配

XmlHttpRequest被访问控制-允许-原产地拒绝,即使原点完全匹配
EN

Stack Overflow用户
提问于 2012-11-26 21:23:04
回答 2查看 3K关注 0票数 5

生命体征:

Chrome版本23.0.1271.64 Mac OS X 10.8.2

情况:

我在https://api.myapi.com/有个网络服务.我希望允许JavaScript应用程序与此API交互。CORS似乎是最合适的(jsonp和朋友们是可怕的,可怕的黑客)。

在我的开发工具中,我可以看到飞行前请求正在发送:

代码语言:javascript
复制
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头精确匹配。

随后,立即尝试实际请求:

代码语言:javascript
复制
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。访问控制-允许-原产地不允许使用http://prototypes.mycompany.com .

我最初是以*作为我允许的来源,但在同样的问题上失败了。

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

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-27 21:13:56

问题解决了!我必须突破gdb才能弄清楚.

代理服务器将自己的CORS头插入到请求中。因此,HTTP会话多次指定标头。安全检查是针对第一个头(即"*“)进行检查,并失败了请求。请求失败打印出最后一个头值,该值看起来是正确的。

帮不上什么忙,WebKit!

票数 1
EN

Stack Overflow用户

发布于 2012-11-27 00:53:18

想法:

  • 我注意到您的Access-Control-Allow-Headers中没有Access-Control-Allow-Headers。我不认为他们是必要的,但你有Content-Length,我也不认为这是必要的。
  • 你在使用Authorization,你认为你应该使用凭据吗?(很明显,有时候你应该在回复中包括Access-Control-Allow-Credentials: true。)

(这些几乎不值得“回答”,但愚蠢的评论不允许换行符。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13573379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档