跨域 Ajax 调用在 Safari 4 和 Safari 5 中不起作用

Posted

技术标签:

【中文标题】跨域 Ajax 调用在 Safari 4 和 Safari 5 中不起作用【英文标题】:Cross domain Ajax Call Not working in Safari 4 and Safari 5 【发布时间】:2014-03-29 17:23:23 【问题描述】:

我有以下 jquery ajax 代码可在 ALL 除 Mac 中的 Safari 4 和 Safari 5 之外的其他浏览器中使用。它在 Safari 6 中正常工作。

$.ajax(
        type : "POST",
        url : crossDomainURL,
        contentType : "text/plain",
        data : requestData,
        dataType : "text",
        success : function(e) 
            console.log("success");

        ,
        error : function(e) 
            console.dir(e);
            console.log("FAILLLLLLLLL");
        ,
    );

它每次都会在控制台上打印“FAILLLLLLL”语句,statusText 为错误,状态为 0。crossDomainURL 处的服务器已正确配置为处理此类请求(因此它可以正常工作在所有其他浏览器中)。

但对于 Mac 上的 Safari(4 和 5),ajax 调用甚至不会离开浏览器。它似乎与 CORS 问题有关,但我很困惑为什么相同的代码在 Firefox、Chrome 和 Safari 6 中正确工作,但在 Safari 4 和 5 中却没有。

我很欣赏任何想法。

谢谢。

编辑:可以在这里找到旧版本的 Safari:http://michelf.ca/projects/multi-safari/

【问题讨论】:

***.com/questions/16824661/…的可能重复 我在发布这个问题之前遇到了这个问题。该问题并非特定于我遇到问题的版本。上面的代码在 Safari 6 中正常工作。我的服务器也正确配置了 Access-control-allow-origin 您考虑过使用 JSONP 作为数据类型吗? 如果我无法确定此处的实际问题,我可能会最终实施这种解决方法。 【参考方案1】:

我将一个带有 CORS 标头集的示例 nodejs 应用程序放在一起,并且能够在 Safari 4 (Mac) 上成功完成跨域请求。

Access-Control-Allow-Origin *
Access-Control-Allow-Methods GET,PUT,POST,DELETE
Access-Control-Allow-Headers Content-Type

服务器代码可以在这里找到:https://github.com/sfarthin/cross-domain-ajax-nodejs/blob/master/server.js 并部署到 Heroku (polar-dawn-3847.herokuapp.com)。

可以在此处找到示例跨域请求: http://jsfiddle.net/78SYj/2/ (jsFiddle的接口在Safari 4中坏掉了,但仍然执行ajax请求)

$.ajax(
    type : "POST",
    url : "http://polar-dawn-3847.herokuapp.com/",
    contentType : "text/plain",
    dataType : "text",
    success : function(e) 
        alert("success");

    ,
    error : function(e) 
        alert("FAILLLLLLLLL");
    
);

如果您分享您的服务器代码/配置,我认为我们将能够追踪问题。

【讨论】:

【参考方案2】:

我已经阅读了 Safari 6 之前版本中的错误,这些错误会导致 Windows 身份验证出现问题。要尝试的一件事是更改您网站的身份验证设置。从提供商中删除 Negotiate,并离开 NTLM。

更多信息:http://msdn.microsoft.com/en-us/library/cc339532%28v=vs.90%29.aspx

【讨论】:

我正在开发的所有基础架构都是基于 Linux/Apache 的。【参考方案3】:

由于它可以在除 Safari 4 和 5 之外的所有其他浏览器上运行,让您感到痛苦,我怀疑这是一些配置问题,与这两个浏览器不兼容。

所有主要浏览器都支持CORS,包括您提到的那两个。请查看here

由于内容类型与正常不同,您可能需要包含

Access-Control-Allow-Headers

如果缺少响应标头。

请检查提琴手中的请求以查看正在传递的内容以及失败的原因?如果它首先发送 OPTION 请求以向服务器寻求是否允许跨源请求的许可,您可能需要提供带有 headers 的响应

Access-control-allow-origin  
Access-Control-Allow-Headers

甚至在你的主要请求被执行之前。

【讨论】:

以上是关于跨域 Ajax 调用在 Safari 4 和 Safari 5 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义标头的跨域 jquery ajax api 调用未命中服务器

带有跨域重定向的 Safari xhr (AJAX) 请求失败

APPLE-SA-2019-3-25-4 Safari 12.1

跨域 Ajax 请求在 Opera 和 IE9 中不起作用?

Safari 中的跨域资源共享策略拒绝了跨域重定向

ajax调用.net API项目跨域问题解决