Почему Ajax дает мне ошибку перекрестного происхождения, когда я могу сделать запрос с PHP?

Я могу сделать запрос GET с PHP и получить правильный ответ. Это функция, которую я использую:

PHP

function httpGet($url) { $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); curl_setopt($ch,CURLOPT_HEADER, false); $output=curl_exec($ch); curl_close($ch); return $output; } 

Простой пример:

 $fakevalue='iamfake'; $url="http://fakeurl.com?fakeparameter=".$fakevalue; $jsondata= httpGet($url); $fake_array = json_decode($jsondata, true); $weed_var=$fake_array['weeds']; // successfully obtained weed. 

Эта функция возвращает ответ от сервера.

Теперь я пытаюсь использовать тот же HTTP-запрос GET в AJAX, но я не могу получить ответ.

Первоначально я думал, что проблема связана с функцией JavaScript, которую я использую. Google предоставил мне множество функций JavaScript для выполнения запроса HTTP GET, но все они имели одинаковую проблему. Запрос возвращает ошибку вместо данных, которые я получил, когда я использовал PHP.

JAVASCRIPT

 var fakevalue = "iamfake"; var fake_data = { fakeparameter: fakevalue }; $.ajax({ url: "http://fakeurl.com", data: fake_data, type: "GET", crossDomain: true, dataType: "json", success: function(a) { $("#getcentre").html(a); }, error: function() { alert("Failed!"); } }); 

Ошибка с JavaScript

 XMLHttpRequest cannot load http://fakeurl.com?fakeparameter=fakevalue. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost' is therefore not allowed access.` 

Я знаю, что вы скажете мне использовать CORS, но если это было из-за отсутствия заголовка Access-Control-Allow-Origin, то как я получил ответ на ту же службу в PHP?

С помощью PHP (или чего-либо еще, выполняемого на вашем сервере или автономного приложения (включая те, которые установлены как расширение для браузера)), вы запрашиваете данные с сервера Боба, используя свои учетные данные (ваши файлы cookie, ваш IP-адрес, все остальное).

С помощью Ajax вы просите браузер Алисы запрашивать данные с сервера Боба, используя свои учетные данные, а затем, чтобы сделать эти данные доступными для вашего JavaScript (который затем может отправить его обратно на ваш сервер, чтобы вы могли увидеть его сами).

Боб мог дать Алисе разные данные, которые он дал бы тебе. Например: Боб может запустить систему eBanking или корпоративную интрасеть Alice.

Следовательно, если сервер Боба не говорит обозревателю Алисы о том, что это нормально, чтобы сделать эти данные доступными для вас (с помощью CORS), браузер не позволит вашему JavaScript получить доступ к этим данным.

Существуют альтернативы CORS, но они включают в себя либо распространение данных с использованием типа файла, который не предназначен для формата данных (JSONP) (который также требует взаимодействия с сервером Боба), либо если ваш сервер извлекает данные из Боба, а затем сделать его доступным через URL-адрес вашего сервера (или какая-то комбинация из двух, как это делает YQL) (что означает, что вы получите данные, которые Боб даст вам, а не данные, которые Боб даст Алисе).

Простой ответ: PHP не влияет на CORS. Это ограничение, установленное браузером на клиентском коде, так что доступный URL-адрес позволяет разрешить или отклонить запрос.

Вы работаете в CORS, потому что вы делаете запрос XMLHttpRequest из своего браузера в другой домен, чем ваша страница . Браузер блокирует его, поскольку он обычно разрешает запрос в том же самом источнике по соображениям безопасности. Вам нужно сделать что-то другое, если вы хотите выполнить кросс-доменный запрос. Попробуйте следующее: http://www.html5rocks.com/en/tutorials/cors/

Если вы хотите только запустить GET-запрос, вы можете попробовать использовать JSONP datatype="jsonp" . Примеры: http://www.sitepoint.com/jsonp-examples/