【问题标题】:Cross Domain XML to Javascript from PHP从 PHP 跨域 XML 到 Javascript
【发布时间】:2015-01-18 02:49:35
【问题描述】:

我想将 XML 数据从 php(域 A)发送到远程 javascript 文件(域 B)。 我不能将它们放在同一个域上,我也不能将任何其他文件放在域 B 上。

我已经阅读了关于从 php 而不是 XML 发送 JSONP 对象的信息,但正如我从教程中了解到的那样,我需要一个与 javascript 文件所在域相同的 php 代理。 tutorial link (xhr.open("GET", "xmlproxy.php?url=" + escape(url), true);

任何建议,我该怎么做?

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 的东西

【问题讨论】:

  • JSONP 不需要您使用代理...请告诉我们您需要传输多少数据?这很重要。
  • 想象一个有 100 首曲目的播放列表,每首曲目都有艺术家、曲目标题和时长。我无法真正估计数据块的确切大小,但这是我能想到的最接近的。谢谢你顺便回复。附带说明:我可以访问 php 和 javascript 文件,但我无法将任何其他文件添加到 javascript 所在的同一域中。

标签: javascript php xml json cross-domain


【解决方案1】:

如果您控制输出 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 sn-p,它强制内容类型。:

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();

【讨论】:

  • 我用代码示例编辑了我的问题,因为我无法让它工作。感谢您对 ThW 的帮助!
  • 不起作用并不是真正有用的错误描述。你需要调试什么不起作用。我添加了一些有关如何操作的信息。
  • 非常感谢!这个答案对我帮助很大。现在我需要为 php 文件所在的第二个域获取一个 ssl,它已准备就绪(javascripts 安全域不允许调用没有 SSL 的域)
猜你喜欢
  • 2014-06-26
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
相关资源
最近更新 更多