向另一台服务器发出AJAX请求

16

我有一个 AJAX 代码,如果向远程服务器发起 AJAX 请求,则请求失败:

function loadXMLDoc() {
  if (window.XMLHttpRequest) {
    // code for IE7+, Firefox, Chrome, Opera, Safari
    xmlhttp=new XMLHttpRequest();
  }
  else {
    // code for IE6, IE5
    xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }

  xmlhttp.onreadystatechange = function() {
    if (xmlhttp.readyState==4 && xmlhttp.status==200) {
      document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
    }
  }

  xmlhttp.open("GET", "http://www.google.com", true);
  xmlhttp.send();
}

我该怎么做才能解决这个问题?


1
可能是重复的问题:jQuery AJAX跨域 - John
4个回答

16

看起来你遇到了同源策略的限制。你需要使用相对路径,而不是绝对路径http://www.google.com

作为一种可能的解决方法,你可以设置一个非常简单的反向代理(如果你使用Apache,则可以使用mod_proxy)。这将允许你在AJAX请求中使用相对路径,而HTTP服务器将充当代理到任何“远程”位置。

在mod_proxy中设置反向代理的基本配置指令是ProxyPass。通常使用如下:

ProxyPass     /web-services/     http://third-party.com/web-services/
在这种情况下,浏览器将请求/web-services/service.xml,但服务器将通过充当代理来提供服务:http://third-party.com/web-services/service.xml
另一种常见的解决方法是使用JSONP

3
作为一项安全措施,AJAX不允许您向其他域发出请求。跨域Ajax:快速概述讨论了几种解决该问题的方法。最简单的方法是使用您的服务器作为代理来下载远程内容:

这是最常用的方法之一。您的脚本调用您的服务器,您的服务器调用远程服务器,然后将结果返回给客户端。这种方法有一些明显的优点:您对整个生命周期具有更多的控制权。您可以解析来自远程服务器的数据,在将其发送回客户端之前进行任何处理。如果出现任何故障,您可以以自己的方式处理它们。最后,您可以记录所有远程调用。通过这样做,您可以跟踪成功、失败和流行度。


1

我想在最佳答案的基础上再提供一种变化。我尝试在我的.htaccess文件中使用ProxyPass,但是一直收到内部服务错误。最终,在阅读了一些资料后,我发现可以使用重写引擎以另一种方式实现这一点。

RewriteEngine On
RewriteRule ^mail.php$ http://otherwebsite.com/mail.php [P,L]

"

[P,L] 中的 P 表示 rewrite 系统正在使用 mod_proxy。这对我很有效,我没有遇到内部服务器错误。

这种方法的优点是因为它使用了 Rewrite Engine,你可以更好地控制可能需要动态发送到脚本的变量。

"

0

5
我不想听起来像个讨厌的人,但是你的文章只是书中代码片段。此外,它没有详细说明另一端需要专门支持此类脚本加载,并且这并不是一劳永逸的方法。-1 - Doug Neiner
这句话是什么意思?它不能全面运作? 你能给我举个例子吗?由于同源策略,这是跨域“ajax-like”请求的唯一方式... - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接