2016-04-24 77 views
0

好吧,我已经在这里好几个小时了!而且我已经阅读了有关这个主题的所有可能的链接,但是我仍然无法完成它的工作,并且这让我慢慢地疯狂起来。我正在做一个AJAX请求(从我的域名)到一个API(在另一个域名),但我一直在控制台日志中回来(显然我已经修改排除任何域等):Ajax API调用Access-Control-Allow-Origin。原产地不允许访问

XMLHttpRequest无法加载https://[APIPROVIDER]/something.json?options。请求的资源上没有“Access-Control-Allow-Origin”标题。因此'Origin'http://[MYDOMAIN].com'不允许访问。

这是我的代码

$(document).ready(function() { 
function step1(){ 
    $.ajax({ 
     url: 'getit.php', 
     method: 'get', 
     dataType : 'json', 
     success: function(data){ 
      step2(data.url); 
     }, 
     error: function(jqXHR, status, error) { 
      console.log(error); 
     } 
    }); 
} 
function step2(url){ 
    $.ajax({ 
     url: url, 
     type: 'get', 
     dataType : 'json', 
     success: function(data){ 
      console.log(data); 
     }, 
     error: function(xhr, status, error) { 
      console.log(error); 
     } 
    }); 
} 
step1(); 
}); 

我试过,ajaxSetup(设置头),并没有帮助。 我试过了,标题:{'Access-Control-Allow-Origin':'*'}。 我试过了crossDomain:true。 我试着删除dataType:'json'。

就像我说的,这让我很生气。主要是因为这是阻止我继续前进并努力提出回应的唯一因素。而且它非常接近,无论我做什么,我都会一直这样做。我已经阅读了几篇有关CORS,头文件中的Access-Control-Allow-Origin的文章。我仍然不明白为什么我得到这个错误。

任何帮助在这里非常感谢! /绝望

+1

这已经在SO上多次提出。仅供参考,Access-Control-Allow-Origin是服务器需要设置的标题,它应该将您的域列为允许的来源。 – WreckeR

+0

@WreckeR是的。我知道这个问题已被多次询问(我无意“滥发社区”)。无论我做了什么,我都无法让它工作。尽管谢谢你的回答。我一直在阅读,并最终与PHP代理合作。就像我自己的回答中所述。我想我只是需要一些睡眠,看到所有与“新鲜的眼睛”:) – axelra82

+0

不要错误的方式。标记重复只是一种帮助其他人最终解决这个问题的方法,并将他们指向已经有高度投​​票答案的问题。 – WreckeR

回答

0

我不得不承认,我对AJAX的整个CORS/Access-Control-Allow-Origin仍然有点困惑(从我的理解这是客户端调用jQuery的结果。因为服务器端的域名不再“在场”)。但我终于用它来使用PHP代理。这就是我最终的结果(对于我自己的符号以及任何其他人正在努力解决相同的问题)。

注意!“关键”部分是针对我自己的需求而设计的(我只是想给所有人介绍这些代码)。也就是说,这里解决的问题是代理部分,使服务器端调用服务器端并发送带有正确标题的请求。

的jQuery/AJAX

$(document).ready(function() { 
    function step1(){ 
     $.ajax({ 
      url: 'key.php', //get the API key. Remember to check path for key 
      method: 'get', 
      dataType : 'json', 
      success: function(data){ 
       step2(data.key); //start step2 and send the key 
      }, 
      error: function(jqhxr, status, error) { 
       console.log(error); 
      } 
     }); 
    } 
    function step2(key){ 
     var apiCall = '[APIURL]'; 
     $.ajax({ 
      beforeSend: function(jqxhr, settings) { //send request via PHP proxy. Remember to check path for proxy 
       settings.url = 'proxy.php?r=' + encodeURIComponent(settings.url); 
      }, 
      url: apiCall, 
      type: 'get', 
      dataType : 'json', 
      data: { 
       apikey: key 
      }, 
      success: function(data){ 
       // do something with response 
      }, 
      error: function(xhr, status, error) { 
       console.log(error); 
      } 
     }); 
    } 
    step1(); //initiate everything 
}); 

PHP信息getKey

<?php 
    require_once('[MY_ABS_PATH_ON_SERVER]/key.php'); //Store API Key outside of public domain for security purposes 
?> 

PHP关键

<?php 
    $key = '[MY_API_KEY]'; 

    $arrvars = array(
     'key' => $key 
    ); 

    echo json_encode($arrvars); 
?> 

PHP代理(在服务器上公开accessabel文件夹之外)

<?php 

    $url = $_GET["r"]; 

    $ch = curl_init($url); 
    $options = array(
     CURLOPT_SSL_VERIFYPEER => false, 
     CURLOPT_RETURNTRANSFER => true 
    ); 
    curl_setopt_array($ch, $options); 
    $response = curl_exec($ch); 
    curl_close($ch);  

    header("Content-Type: application/json; charset=utf-8"); 
    header("Access-Control-Allow-Headers: X-Requested-With"); 
    header("Access-Control-Allow-Methods: GET, OPTIONS"); 
    header("Access-Control-Allow-Origin: [MYDOMAIN]"); 


    echo($response); 
?> 

我觉得我只是需要一些睡眠......我一直在盯着这个视线很久。

相关问题