我想将XML数据从php(域A)发送到远程javascript文件(域B)。我不能将它们放在同一个域上,也不能在域 B 上拥有任何其他文件。
我已经读过有关从 php 而不是 XML 发送 JSONP 对象的信息,但正如我从教程中了解到的那样,我需要在与 javascript 文件所在的域相同的域上使用 php 代理。 教程链接(xhr.open("GET", "xmlproxy.php?url=" + escape(url), true);<= 这一行有点告诉我,XMLPROXY .php 必须与实际的 JavaScript 位于同一域中)
关于我该怎么做的任何建议?
稍后在ThW的回答后编辑
现在我有以下示例代码:
测试日志.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的事情。
如果你控制输出XML的PHP,你可以使用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 控制台。它应该输出一条错误消息。在火狐中,它是这样的:
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
如果收到请求,它应显示在开发人员工具的"网络"选项卡中,并且可以验证 HTTP 响应标头。
这是使用XHR的简单JS片段,它强制使用内容类型。
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();