Я хочу отправить данные XML с php (домена ) в удаленный файл JavaScript (домен В).
У меня не может быть их в одном домене, и у меня не может быть других файлов в домене B.
Я читал об отправке объекта JSONP из php вместо XML, но, как я понял из учебника, мне понадобится php-прокси в том же домене, где находится файл javascript. учебная ссылка
(xhr.open («GET», «xmlproxy.php? url =» + escape (url), true); <= эта строка как бы говорит мне, что xmlproxy.php должен находиться в том же домене, что и настоящий javascript)
Любые предложения, как я мог это сделать?
ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ ПОСЛЕ ответа Thw
Теперь у меня есть следующий пример кода:
Файл testlog.php
<?php header('Access-Control-Allow-Origin: *');
print "<Logs><Log><id>Test Log</id></Log></Logs>";
?>
Функция javascript, которая вызывается при загрузке страницы:
function getTestLog() {
alert("Gets here!");
$.ajax({
url: "anotherdomain/testlog.php",
data: requestVars,
dataType: 'xml',
success: function(xml){
alert(xml);
},
error: function (xhr, err) {
alert("Error: " + xhr.readyState + "\nstatus: " + xhr.status + "\nerror:" + err);
alert("responseText: " + xhr.responseText);
}
});
}
Проблема в том, что это не входит в AJAX
Если вы управляете PHP, который выводит XML, вы можете использовать CORS.
По умолчанию Javascript может открывать ресурсы только из домена, в который он был загружен. Другие ресурсы должны позволять загружать их с помощью Javascript в другом домене.
Для этого добавьте заголовок в PHP-скрипт:
header('Access-Control-Allow-Origin: http://javascript-domain.tld');
Или разрешить загрузку XML из любого места:
header('Access-Control-Allow-Origin: *');
Вы используете jQuery, и здесь может возникнуть проблема, если вы не отправляете правильный тип контента из PHP.
header('Content-Type: application/xml');
Чтобы удостовериться в том, что именно кросс-домен блокирует чтение, откройте консоль Javascript в браузере. Должно появиться сообщение об ошибке. В Firefox это что-то вроде:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading
the remote resource at http://domain.tld/path/to/resource. This can be fixed by
moving the resource to the same domain or enabling CORS
Если вы получите запрос, он должен появиться на вкладке Network ваших инструментов разработчика, и вы сможете проверить заголовки HTTP-ответа.
Вот простой фрагмент JS, использующий XHR, он вызывает тип контента:
var xhr = new XMLHttpRequest;
xhr.overrideMimeType("application/xml");
xhr.addEventListener(
'load',
function (xhr) {
return function () {
if (xhr.status >= 200 && xhr.status < 400) {
console.log(xhr.responseXML);
}
}
}(xhr)
);
xhr.open('GET', 'http://php-domain.tld/script.php');
xhr.setRequestHeader("Accept", "application/xml");
xhr.send();
Других решений пока нет …