Вот две страницы, test.php и testserver.php.
test.php
<script src="scripts/jq.js" type="text/javascript"></script>
<script>
$(function() {
$.ajax({url:"testserver.php",
success:function() {
alert("Success");
},
error:function() {
alert("Error");
},
dataType:"json",
type:"get"
}
)})
</script>
testserver.php
<?php
$arr = array("element1",
"element2",
array("element31","element32"));
$arr['name'] = "response";
echo json_encode($arr);
?>
Теперь моя проблема: когда оба эти файла находятся на одном и том же сервере (локальном или веб-сервере), он работает и alert("Success")
вызывается; Если он находится на разных серверах, то есть testserver.php на веб-сервере и test.php на localhost, он не работает и alert("Error")
выполняется. Даже если URL-адрес внутри ajax изменен на http://domain.com/path/to/file/testserver.php
javascript
jquery
ajax
json
cross-domain
Фироза Хуссейн
источник
источник
Ответы:
Используйте JSONP .
JQuery:
PHP:
Эхо может быть неправильным, я уже давно не использую php. В любом случае вам необходимо вывести
callbackName('jsonString')
уведомление о кавычках. jQuery передаст свое собственное имя обратного вызова, поэтому вам нужно получить его из параметров GET.И, как написал Стефан Кендалл, $ .getJSON () - это сокращенный метод, но затем вам нужно добавить
'callback=?'
URL в качестве параметра GET (да, значение равно?, JQuery заменяет его собственным сгенерированным методом обратного вызова).источник
callbackName('/* json */')
вместоcallbackName(/* json */)
?JSONP - хороший вариант, но есть более простой способ. Вы можете просто установить
Access-Control-Allow-Origin
заголовок на вашем сервере. Установка этого параметра*
будет принимать междоменные запросы AJAX из любого домена. ( https://developer.mozilla.org/en/http_access_control )Способ сделать это будет варьироваться от языка к языку, конечно. Вот это в Rails:
В этом примере
say_hello
действие будет принимать запросы AJAX от любого домена и возвращать ответ «привет!».Вот пример заголовков, которые он может вернуть:
Как бы легко это ни было, у него есть некоторые ограничения браузера. Смотрите http://caniuse.com/#feat=cors .
источник
.post()
метод jQuery, вы должны включить междоменную поддержку в jQuery. Это делается с этим:$.support.cors = true
.Вы можете контролировать это через HTTP-заголовок, добавив Access-Control-Allow-Origin . Установка * будет принимать междоменные AJAX-запросы от любого домена.
С помощью PHP это действительно просто, просто добавьте следующую строку в скрипт, к которому вы хотите иметь доступ извне вашего домена:
Не забудьте включить модуль mod_headers в httpd.conf.
источник
Вам нужно взглянуть на ту же политику происхождения :
Чтобы вы могли получить данные, это должно быть:
Тот же протокол и хост
Вам нужно реализовать JSONP, чтобы обойти это.
источник
Мне пришлось загрузить веб-страницу с локального диска «file: /// C: /test/htmlpage.html», вызвать URL «http: //localhost/getxml.php» и сделать это в браузерах IE8 + и Firefox12 +, использовать jQuery v1 .7.2 lib для минимизации стандартного кода. Прочитав десятки статей, наконец-то разобрался. Вот мое резюме.
Вот пример вызова jQuery ajax с некоторыми sysouts отладки.
источник
header("Access-Control-Allow-Origin: *");
Это правда, что политика одного и того же происхождения не позволяет JavaScript выполнять запросы между доменами, но спецификация CORS разрешает только тот тип доступа к API, который вы ищете, и поддерживается текущей партией основных браузеров.
Посмотрите, как включить общий доступ к ресурсам для клиента и сервера:
http://enable-cors.org/
«Cross-Origin Resource Sharing (CORS) - это спецификация, которая обеспечивает действительно открытый доступ через границы домена. Если вы предоставляете общедоступный контент, рассмотрите возможность использования CORS, чтобы открыть его для универсального доступа JavaScript / браузера».
источник
Это возможно, но вам нужно использовать JSONP, а не JSON. Ссылка Стефана указала вам в правильном направлении. Страница jQuery AJAX содержит больше информации о JSONP.
У Реми Шарпа есть подробный пример использования PHP .
источник
Я использую сервер Apache, поэтому я использовал модуль mod_proxy. Включить модули:
Затем добавьте:
Наконец, передайте proxy-url в ваш скрипт.
источник
Безопасность браузера предотвращает вызов ajax со страницы, размещенной в одном домене, на страницу, размещенную в другом домене; это называется « политика того же происхождения ».
источник
Есть несколько примеров использования JSONP, которые включают обработку ошибок.
Тем не менее, обратите внимание, что событие error не вызывается при использовании JSONP! См: http://api.jquery.com/jQuery.ajax/ или запрос JQuery Ajax , используя ошибку JSONP
источник
Из документов Jquery ( ссылка ):
Из-за ограничений безопасности браузера большинство запросов «Ajax» подчиняются той же политике происхождения; запрос не может успешно получить данные из другого домена, субдомена или протокола.
На запросы сценариев и JSONP не распространяются одинаковые ограничения политики происхождения.
Поэтому я бы взял, что вам нужно использовать jsonp для запроса. Но сам не пробовал.
источник
Я знаю 3 способа решения вашей проблемы:
Во-первых, если у вас есть доступ к обоим доменам, вы можете разрешить доступ ко всем другим доменам, используя:
header("Access-Control-Allow-Origin: *");
или просто домен, добавив код ниже в файл .htaccess:
<FilesMatch "\.(ttf|otf|eot|woff)$"> <IfModule mod_headers.c> SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.net|dev02.otherdomain.net)$" AccessControlAllowOrigin=$0 Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin </IfModule> </FilesMatch>
вы можете иметь ajax-запрос к php-файлу на вашем сервере и обрабатывать запрос к другому домену, используя этот php-файл.
источник
Для Microsoft Azure это немного другое.
Azure имеет специальный параметр CORS, который необходимо установить. Это по сути то же самое за кулисами, но простая установка заголовка, о котором упоминает Джошуар, не сработает. Документацию по Azure для включения междоменного домена можно найти здесь:
https://docs.microsoft.com/en-us/azure/app-service-api/app-service-api-cors-consume-javascript
Я возился с этим несколько часов, прежде чем понял, что на моей хостинговой платформе есть эта особая настройка.
источник
все работает, все что нужно:
PHP:
JS (jQuery ajax):
источник