【问题标题】:CORS complaint on Safari 5.1.7 (windows 7)Safari 5.1.7(Windows 7)上的 CORS 投诉
【发布时间】:2013-11-14 05:29:42
【问题描述】:

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

【问题讨论】:

    标签: safari xmlhttprequest cors


    【解决方案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,但不会发送基本的身份验证详细信息(尽管在那里明确列出了 Authorization 标头)。从这个版本的 WebKit (534.57.2) 开始,这可能是对 CORS 实现的故意限制,而不是错误。

    【讨论】:

    • 根据规范,如果请求包含不被视为“简单标头”的标头,即。授权,需要预检请求。所以,这不是一个错误。
    猜你喜欢
    • 1970-01-01
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    相关资源
    最近更新 更多