关于Safari 5.1.7的CORS投诉(Windows 7)

时间:2013-11-03 13:27:46

标签: safari xmlhttprequest cors

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错误?我的问题是我需要做些什么来解决它?

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),而不是错误。