代码之家  ›  专栏  ›  技术社区  ›  lewsid

带jquery/php的跨域Ajax请求

  •  4
  • lewsid  · 技术社区  · 15 年前

    帮助,如果可以的话-

    情况:

    http://foobar.com 包括远程托管的javascript文件( http://boobar.com/stuff.js )

    目标是从foobar.com上远程托管的PHP脚本获取警报。

    我在stufacture.js中尝试了以下代码:

    $.ajax({
      type: "GET",
      url: "http://www.boobar.com/script.php?callback=?",
      dataType: 'jsonp',
      success: function(result) { alert(result); }
    });
    

    运气不好。

    $.getJSON("http://www.boobar.com/script.php?jsonp=?",
      function(data) { alert(data); }
    );
    

    也不走运。

    在PHP方面,我尝试了以下两种方法:

    return json_encode(array(0 => 'test'));
    
    echo json_encode(array(0 => 'test'));
    

    在Firefox中,我得到一个安全错误。我知道它认为我违反了安全模式。但是,根据jquery文档,我应该能够完成这一点。

    6 回复  |  直到 8 年前
        1
  •  8
  •   Piskvor left the building Rohit Kumar    15 年前

    该错误似乎是 Same Origin Policy :为了简化,您只能对原始服务器上的内容进行Ajax请求。( http://foobar.com )解决此问题的一种方法是在原始服务器上创建一个简单的外观,例如:

     <?php
     // this file resides at http://foobar.com/getstuff.php
     echo file_get_contents('http://www.boobar.com/script.php?callback=?'
              . $possibly_some_other_GET_parameters );
     ?>
    

    然后,从foobar.com,您可以对 http://foobar.com/getstuff.php (然后发出HTTP GET请求 从Web服务器 boobar.com 并将其发送回浏览器)。

    对于浏览器,请求将转到源服务器,并被允许(浏览器无法知道响应来自场景后面的其他地方)。

    Caveats:

    • foobar.com上的php配置必须具有 allow_url_fopen 设置为“1”。虽然这是默认设置,但有些服务器禁用了它。
    • 对www.boobar.com的请求来自foobar.com。 服务器 ,而不是从浏览器。这意味着不会向www.boobar.com发送cookie或用户身份验证数据,只要您将其放入请求URL(“ $possibly_some_other_GET_parameters “”。
        2
  •  4
  •   Jeff Ober    15 年前

    您可以使用脚本标记和JSON从另一台服务器异步获取数据:

    <script type="text/javascript" src="http://somesite.com/path/to/page/"></script>
    

    您可以使用它动态加载远程javascript(通过创建一个新的脚本元素并设置src属性,然后加载到dom),这可以设置一个变量。不过,你真的需要 信任 远程站点,因为将评估JS 没有任何先决条件 .

        3
  •  1
  •   fragilewindows Mircea Mihai    8 年前

    有一个方法调用 window.name transport window.name method 它使用一个常规的浏览器错误(不确定这是否是一个错误)。您通过一个iframe发出请求,加载的页面将您需要的信息放在javascript窗口对象本身的“name”属性中。

    此方法使用“blank.htm”,因为它首先导航到目标页,然后返回blank.htm页以克服“同一源策略”限制。

    Dojo已经实现了这一点,您可以找到更详细的解释 here .

    另外,我在我编写的库中实现了一个基于此方法的跨域xmlhttpRequest对象,可以找到 here .

    您可能无法使用该库,因为它需要1个或2个附加库,可以找到这些库 here .

    如果您需要进一步帮助以您的方式实现它,我将尽力。

        4
  •  0
  •   lewsid    15 年前

    所以我最终做了什么,因为它只是一个GET——不需要检索数据——我使用jquery创建了一个隐藏的iframe,其中包含了我想要传递的变量set作为源。工作很有魅力。感谢所有提供反馈的人-谢谢!

        5
  •  0
  •   Randy Lin    15 年前

    这个怎么样!!使用PHP代理。

    使用PHP的跨域Ajax调用 http://www.phpfour.com/blog/2008/03/cross-domain-ajax-using-php/

        6
  •  0
  •   aztechy    11 年前

    ajax也有一个设置“CrossDomain”。

    http://api.jquery.com/jQuery.ajax/

    crossDomain (default: false for same-domain requests, true for cross-domain requests)
    Type: Boolean
    If you wish to force a crossDomain request (such as JSONP) on the same domain, set the value of crossDomain to true. This allows, for example, server-side redirection to another domain. (version added: 1.5)