Javascript ajax跨源请求不存在';不适用于safari,但适用于chrome和firefox

Javascript ajax跨源请求不存在';不适用于safari,但适用于chrome和firefox,javascript,ajax,safari,xmlhttprequest,cors,Javascript,Ajax,Safari,Xmlhttprequest,Cors,我正在制作一个使用脚本标记的shopify应用程序,我需要向我们的服务器打一个ajax调用,以获取有关该商店所需的信息。一切都很好,直到我的同事让我注意到他的iphone根本不起作用。它在mac上的safari中也不起作用,但在chrome中起作用 我注意到请求的状态在safari中始终为“0”,我尝试向测试车间发出请求我正在进行测试,而不是服务器,并且得到了200状态。所以现在我很确定这是一个跨来源的问题 从我发现的情况来看,应该是我需要在请求页面上更改的标题,但我已经有了“Access Co

我正在制作一个使用脚本标记的shopify应用程序,我需要向我们的服务器打一个ajax调用,以获取有关该商店所需的信息。一切都很好,直到我的同事让我注意到他的iphone根本不起作用。它在mac上的safari中也不起作用,但在chrome中起作用

我注意到请求的状态在safari中始终为“0”,我尝试向测试车间发出请求我正在进行测试,而不是服务器,并且得到了200状态。所以现在我很确定这是一个跨来源的问题

从我发现的情况来看,应该是我需要在请求页面上更改的标题,但我已经有了“Access Control Allow Origin:*”,我尝试了所有我能找到的建议,但没有任何效果

目前这是我在请求页面上的内容,我正在使用laravel:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method");
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");

$shop = Shop::where("domain", request('shop'))->first();

echo json_encode(
[ 
    'logo' => $shop->logo, 
    'text' => $shop->customizable_text, 
    'version' => $shop['plan'] 
]);
这是我目前在javascript中调用的函数(起初我使用jquery,但我认为这是问题所在,所以我只使用javascript):

函数ajaxRequest(url、参数、回调){
const req=new XMLHttpRequest();
req.onreadystatechange=函数(事件){
//XMLHttpRequest.DONE==4
if(this.readyState===XMLHttpRequest.DONE){
如果(this.status==200){
回调(this.responseText);
}否则{
console.log(“状态:%d(%s)”,this.Status,this.statusText);
}
}
};
if(参数、键、长度){
url=url+“?”
对于(变量i=0;i

在chrome和firefox中,一切都正常工作,只是safari。你知道我应该怎么做才能解决这个问题吗?

试着让所有标题都检查出来,你缺少任何标题


访问控制允许标题:

像往常一样,这是一个愚蠢的错误。我忘了把's'改成'https'。如果您从https网站向http url发出请求,safari甚至不会尝试发送该请求。

您可能想使用它编辑/更新您的问题,并添加您在safari devtools控制台中看到的确切错误消息(如果有)。如果您转到Safari devtools中的“网络”选项卡,重新加载并检查所有相关请求和响应的详细信息,包括HTTP状态代码、HTTP方法和所有标题,并将其添加到问题中,也会有所帮助too@sideshowbarker我无法使用mac电脑,但我成功地在iphone上使用remotedebug ios webkit适配器进行了调试,没有出现任何错误。我只看到控制台日志“状态:0”。在network选项卡中,我没有看到我的ajax调用,就好像它根本没有被调用一样(但是如果我将url更改为我正在进行测试的同一个域,它就会工作)。
function ajaxRequest(url, parameters, callback){
const req = new XMLHttpRequest();

req.onreadystatechange = function(event) {
    // XMLHttpRequest.DONE === 4
    if (this.readyState === XMLHttpRequest.DONE) {
        if (this.status === 200) {
            callback(this.responseText);
        } else {
            console.log("Status: %d (%s)", this.status, this.statusText);
        }
    }
};

if(parameters.keys.length){
    url = url + "?"
    for(var i = 0; i < parameters.param.length; i++){
        if(i == 0){
            url = url + parameters.keys[i] + "=" + parameters.param[i]
        }
        else{
            url = url + "&" + parameters.keys[i] + "=" + parameters.param[i];
        }
    }
}

req.open('GET', url, true);
req.send(null);
}