http://www4.example.com处尝试与http://www6.example.com/建立xhr连接的页面 浏览器发送带有此标头的GET请求:
Origin: http://www4.example.com
www6.example.com服务器发回:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: http://www4.example.com
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/plain
Date: ...
Keep-Alive: timeout=5, max=100
Transfer-Encoding: Identity
Server: Apache/2.2.20 (Ubuntu)
Vary: Accept-Encoding
X-Powered-By: PHP/5.3.6-13ubuntu3.7
但我得到了:
XMLHttpRequest cannot load http://www6.example.com/myscript.php?xhr=1&t=1234333223. Origin http://www4.example.com is not allowed by Access-Control-Allow-Origin.
我的代码符合我对CORS标准的理解,并且适用于Chrome,Firefox,Opera等,所以我会假设这是一个Safari 5.1错误?我的问题是我需要做些什么来解决它?
答案 0 :(得分:1)
经过大量的反复试验,并观察网络流量,我想我可以自行回答。
Safari错误是它首先发送OPTIONS转航前请求,即使它是GET请求。
为了增加一些额外的复杂性,它似乎只在第二个请求上发送。 (我认为这是因为我的第二个请求发送了一个额外的自定义标题...但我实际上无法隔离它,所以我认为还有其他事情正在发生 - 也许是缓存交互?)
在主响应中发送Access-Control-Allow-Headers
并不能解决问题:它首先执行OPTIONS请求,所以永远不会那么远。
我所做的修复是把它放在PHP脚本的最顶端:
if($_SERVER['REQUEST_METHOD'] == 'OPTIONS'){
header("Access-Control-Allow-Origin: ".@$_SERVER['HTTP_ORIGIN']);
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Headers: Last-Event-Id, Origin, X-Requested-With, Content-Type, Accept, Authorization");
exit;
}
发送回“Access-Control-Allow-Headers:*”不工作。您必须明确列出所需的标头。我进行了简短的实验,看起来它们不区分大小写。
不需要发送“Access-Control-Allow-Methods:POST,GET,OPTIONS”。
另外,Cookie 已发送,但未发送基本身份验证详细信息(尽管明确列出了授权标头)。这可能是对CORS实现的故意限制,因为此版本的WebKit(534.57.2),而不是错误。