как обойти Access-Control-Allow-Origin?

Я делаю вызов ajax на свой собственный сервер на платформе, которую они устанавливают, предотвращают эти вызовы ajax (но мне нужно, чтобы они извлекали данные с моего сервера, чтобы отображать извлеченные данные из базы данных моего сервера). Мой скрипт ajax работает, он может отправить данные на PHP-скрипт моего сервера, чтобы он мог обрабатывать. Однако он не может вернуть обработанные данные, поскольку он заблокирован "Access-Control-Allow-Origin"

У меня нет доступа к источнику / ядру этой платформы. поэтому я не могу удалить скрипт, чтобы он не разрешал мне это делать. (P / SI использовала консоль Google Chrome и обнаружила эту ошибку)

Код Ajax, как показано ниже:

  $.ajax({ type: "GET", url: "http://example.com/retrieve.php", data: "id=" + id + "&url=" + url, dataType: 'json', cache: false, success: function(data) { var friend = data[1]; var blog = data[2]; $('#user').html("<b>Friends: </b>"+friend+"<b><br> Blogs: </b>"+blog); } }); 

или есть эквивалентный код JSON для сценария ajax выше? Я думаю, что JSON разрешен.

Надеюсь, кто-то может мне помочь.

положите его поверх файла retrieve.php

  header('Access-Control-Allow-Origin: *'); 

Важно отметить, что header() должен быть вызван до отправки любого фактического вывода.

Неправильно

 <html> <?php header('Access-Control-Allow-Origin: *'); ?> 

Верный

 <?php header('Access-Control-Allow-Origin: *'); ?> <html> 

Хорошо, но вы все знаете, что * является подстановочным знаком и позволяет выполнять межсайтовый скриптинг из каждого домена?

Почему бы не включить список со своими собственными, доверенными доменами (и протоколами);

  header('Access-Control-Allow-Origin: http://mysite1.com', false); header('Access-Control-Allow-Origin: http://example.com', false); header('Access-Control-Allow-Origin: https://www.mysite2.com', false); header('Access-Control-Allow-Origin: http://www.mysite2.com', false); 

Это намного безопаснее. (Второй параметр «false» указывает функции header() не перезаписывать старый)

Почему это безопаснее?

Разрешая доступ из других мест, ваш собственный доверенный сайт допускает высокоуровневый сеанс. Я собираюсь пойти с небольшим примером – изображение Facebook позволяет создавать подстановочные знаки – это означает, что вы можете где-то создать свой собственный сайт и заставить его запускать вызовы AJAX (или открытые фреймы) в facebook. Это означает, что вы можете захватить зарегистрированную информацию в facebook посетителя вашего сайта. Хуже того – вы можете записывать POST запросы и публиковать данные на чьей-то facebook – просто пока они просматривают ваш сайт.

Будьте осторожны при использовании заголовков ACAO !

Предупреждение. Chrome (и другие браузеры) будут жаловаться на то, что несколько заголовков ACAO установлены, если вы выполните некоторые другие ответы.

Ошибка будет что-то вроде XMLHttpRequest cannot load ____. The 'Access-Control-Allow-Origin' header contains multiple values '____, ____, ____', but only one is allowed. Origin '____' is therefore not allowed access. XMLHttpRequest cannot load ____. The 'Access-Control-Allow-Origin' header contains multiple values '____, ____, ____', but only one is allowed. Origin '____' is therefore not allowed access.

Попробуй это:

 $http_origin = $_SERVER['HTTP_ORIGIN']; $allowed_domains = array( 'http://domain1.com', 'http://domain2.com', ); if (in_array($http_origin, $allowed_domains)) { header("Access-Control-Allow-Origin: $http_origin"); } 

Я исправил эту проблему при вызове контроллера MVC3. Я добавил:

 Response.AddHeader("Access-Control-Allow-Origin", "*"); 

перед моим

 return Json(model, JsonRequestBehavior.AllowGet); 

А также мой $.ajax жаловался, что он не принимает заголовок Content-type в моем вызове ajax, поэтому я прокомментировал его, поскольку я знаю, что его JSON передается Action.

Надеюсь, это поможет.

лучше всего было бы разрешить отдельные домены, будьте осторожны с http: //:

  header('Access-Control-Allow-Origin: http://www.foo.com', false); header('Access-Control-Allow-Origin: http://www.foo2.com', false)); 

Вы пытались на самом деле добавить заголовок Access-Control-Allow-Origin в ответ, отправленный с вашего сервера? Например, Access-Control-Allow-Origin: * ?