同源策略——JavaScript调用PHP

同源策略——JavaScript调用PHP,php,javascript,xmlhttprequest,jsonp,same-origin-policy,Php,Javascript,Xmlhttprequest,Jsonp,Same Origin Policy,我知道这是一个热门话题,但我还没有找到一个完全全面的答案 我正在尝试为我们的“客户”创建一种简单的方法,在他们的网站上放置一个谷歌地图,它在地图上标出我们客户(或其子集)的位置。客户在一个MySQL数据库中,该数据库通过PHP脚本动态转换为XML(根据Google的示例)。这在我的网站上运行良好,但当我在另一个网站上尝试时,xmlHTTPRequest不允许查看PHP,因为它在另一个域上 我可以通过在另一个域上编写另一个PHP文件来避免这种情况,该文件只读取原始域上的PHP文件。但并非所有客户的

我知道这是一个热门话题,但我还没有找到一个完全全面的答案

我正在尝试为我们的“客户”创建一种简单的方法,在他们的网站上放置一个谷歌地图,它在地图上标出我们客户(或其子集)的位置。客户在一个MySQL数据库中,该数据库通过PHP脚本动态转换为XML(根据Google的示例)。这在我的网站上运行良好,但当我在另一个网站上尝试时,xmlHTTPRequest不允许查看PHP,因为它在另一个域上

我可以通过在另一个域上编写另一个PHP文件来避免这种情况,该文件只读取原始域上的PHP文件。但并非所有客户的服务器上都会运行PHP。是否有任何方法可以使用JavaScript从数据库返回XML结果

有两点:

  • 生成xmlHTTPRequest的JavaScript仍然位于我们的服务器上——我们的客户机通过脚本标记链接到它。我认为这可能足够了,但“起源”(无论如何,根据Chrome)仍然被视为域2

  • 这很好:如果我在xmlHTTPRequest中使用绝对引用(例如request.open('GET'),'http://mydomain.com/api/foo.php,true),则它将在IE中失败,但如果我使用相对引用('/api/foo.php'),它将工作

  • 我对它了解不够,但我可以使用JSON吗?我看到: '脚本src='http://..../someData.js?callback=some_func"' 但我不知道如何让“someData.js”看起来像JSON?(我从函数的角度考虑了很多,这可能是不正确的?)

  • 我尝试添加: 标题(“访问控制允许原点:”; 到输出XML的PHP的顶端,但我能告诉你,它并没有做多少事情

  • 如果我在客户端的服务器上使用PHP包装器,那么使用cURL请求,而不是简单的file\u get\u contents或fopen,有什么好处

  • 抱歉,有很多问题,但如果您能提供任何指导,我们将不胜感激

    非常感谢


    Mat

    JavaScript是客户端,但数据库不是。JavaScript不能直接从MySQL数据库中提取。

    一种简单的方法是让PHP脚本返回如下内容:

    callback_function(YOUR_DATA);
    
    然后在客户端站点上包含的JS脚本中,动态插入一个指向PHP脚本的
    ,其中包含
    src

    (function() {
        var scriptElement   = document.createElement('script');
        scriptElement.type  = 'text/javascript';
        scriptElement.async = true;
        scriptElement.src   = 'http://example.org/yourScript.php?data=...';
        var container       = document.getElementsByTagName('script')[0];
        container.parentNode.insertBefore(scriptElement, container);
    })();
    
    此技术被调用,应该完全按照您的要求执行;)


    解决此问题的另一种方法是在内容安全策略中允许跨域XMLHttpRequest。但是我认为现在只有Firefox4支持这个功能。

    你能用JSON代替XML吗?如果是这样的话,你的选择可能是你最好的选择。这种方法存在安全风险,只能用于已知和可信的源


    更多阅读:

    #3被称为JSONP,这听起来像是您在这里需要的。是的,这就是实现它的方法。从您的域中嵌入脚本,如果需要,将变量作为参数传递给php。我想我要花一点时间才能弄清楚,但我[想我!]大体上明白了这个想法。谢谢nikic。好的,因为脚本是异步加载的,所以当我尝试访问json数据时会抛出错误。它什么时候可用/我如何等到它可用后再尝试访问它?另外,如果我使用“callback_fn({mydata})”,我会被告知没有定义“callback_fn”。您必须先定义回调函数,然后动态加载脚本;)太阳照在大理石的头上。是的,现在开始掌握它了!只花了一天时间。。。这是有用的:。PS:谢谢;再一次!