从PHP跨域XML到Javascript

时间:2014-11-20 09:43:21

标签: javascript php xml json cross-domain

我想将来自php(域 A )的XML数据发送到远程javascript文件(域 B )。 我无法将它们放在同一个域中,而且我无法在域B上拥有任何其他文件。

我已经阅读过从php而不是XML发送JSONP对象,但正如我从教程中所理解的那样,我需要在与javascript文件所在的域相同的域上使用php代理。 tutorial link xhr.open(" GET"," xmlproxy.php?url =" + escape(url),true); < =此行有点告诉我,xmlproxy.php必须与actuala javascript在同一个域上)

有关我怎么能这样做的任何建议?

在回答后再编辑

现在我有以下示例代码:

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的事情

1 个答案:

答案 0 :(得分:0)

如果您控制输出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控制台。它应该输出一条错误信息。在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-Tab中,您可以验证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();