跨域 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