从域other使用ajax时出错

时间:2011-11-14 10:02:54

标签: php ajax jquery

在具有域http://domain1的host1中,我使用带结构的ajax:

  1. index.php(包括ajax)
  2. config.php(连接数据库)
  3. get_city.php
  4. 代码在这里:

    index.php
    $(document).ready(function(){
       $('.nation').change(function(){
            var id = $(this).val();
            var dataString = 'id='+id;
            $.ajax({
               type: 'POST',
               url: '**http://domain1/get_data.php**',
               data: dataString,
               cache: false,
               success: function(html) {
                    $('.city').html(html);
               } 
            });
       });
    });
    
    get_city.php中的

    <?php
    include 'config.php';
    $id = $_POST['id'];
    if($id) {
        $query = mysql_query("Select * From  jos_city Where nation_id = id");
        while($row = mysql_fetch_array($query)) {
            $id = $row['id'];
            $name = $row['city_name'];
            echo '<option value="'.$id.'">'.$name.'</option>';
        }
    }
    

    当我使用域http://domain2的其他主机时,无法加载ajax

     $(document).ready(function(){
           $('.nation').change(function(){
                var id = $(this).val();
                var dataString = 'id='+id;
                $.ajax({
                   type: 'POST',
                   url: '**http://domain1/get_data.php**',
                   data: dataString,
                   cache: false,
                   success: function(html) {
                        $('.city').html(html);
                   } 
                });
           });
        });
    

    我认为,从域名1调用url:'http://domain1/get_data.php'时会发生错误。有没有人知道,为什么会发生这种情况?

3 个答案:

答案 0 :(得分:3)

AJAX调用必须符合same origin policy,不能对另一个域进行普通的AJAX调用。

但是,有workarounds

  

为了使开发人员能够以受控的方式规避同源策略,使用片段标识符或window.name属性等许多“黑客”来在驻留的文档之间传递数据。不同的领域。使用HTML5标准,为此形式化了一个方法:postMessage接口,该接口仅在最近的浏览器中可用。 JSONP和跨源资源共享也可用于启用与其他域类似的AJAX调用。[2]

     

为了支持旧浏览器,JavaScript库easyXDM可用于为postMessage接口提供统一的API,以及用于允许跨域消息传递(XDM)的许多黑客。

答案 1 :(得分:1)

另一种方式 -

  1. 对another_file.php文件(位于同一域中)进行AJAX调用

  2. 来自another_file.php的
  3. ;向其他域执行 CURL 请求并获得回复

  4. 这是一个简单的 CURL example

答案 2 :(得分:0)

所有AJAX调用必须符合相同的原始规则。此规则阻止AJAX调用另一个域。

事实:

  

在计算中,相同的原始政策是一个重要的安全概念   对于许多浏览器端编程语言,例如   JavaScript的。该策略允许在源自页面上运行的脚本   从同一个站点访问彼此的方法和属性   没有具体的限制,但阻止访问大多数方法和   不同网站上页面的属性。

     

这种机制对现代网络具有特殊意义   广泛依赖HTTP cookie维护的应用程序   经过身份验证的用户会话,因为服务器基于HTTP cookie   显示敏感信息或改变状态的信息   动作。严格区分不相关的内容   必须在客户端维护站点以防止数据丢失   机密性或完整性。

历史:

  

同源策略的概念可以追溯到Netscape Navigator   2.0。原始设计的近似衍生产品在所有当前浏览器中使用,并且经常扩展以定义大致兼容的安全性   其他Web脚本语言的边界,例如Adobe Flash或   对于直接DOM操作以外的机制,例如   XMLHttpRequest的。

有关详细信息,请参阅this Wikipedia page

另一种方法是使用AJAX调用PHP文件(在您的域上)。然后执行cURL调用。有关详细信息,请参阅PHP.net。并here's a simple example