2016-04-24 90 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); 
?> 

我覺得我只是需要一些睡眠......我一直在盯着這個視線很久。

相關問題