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

时间:2010-05-17 17:14:25

标签: javascript ajax

我有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();
}

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

4 个答案:

答案 0 :(得分:16)

看起来你碰到了same origin policy。您必须使用相对路径而不是绝对http://www.google.com路径。

作为一种可能的解决方法,您可以设置一个非常简单的reverse proxy(如果您使用的是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

答案 1 :(得分:3)

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

  

这是最常见的方法之一。您的脚本调用您的服务器,您的服务器调用远程服务器,然后将结果返回给客户端。这种方法有一些明显的优势:您可以更好地控制整个生命周期。您可以从远程服务器解析数据,在将数据发送回客户端之前将其与您的数据进行对比。如果在此过程中出现任何问题,您可以按照自己的方式处理。最后,您可以记录所有远程呼叫。你可以跟踪成功,失败和受欢迎程度。

答案 2 :(得分:0)

您可以使用dynamic script loading。这是我写的关于它的文章。

答案 3 :(得分:0)

我想在最佳答案上发布另一个变体。我试图在我的.htaccess文件中使用ProxyPass,但我一直收到内部服务错误。经过一些阅读后,我发现还有另一种方法可以使用重写引擎。

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

[P,L]中的P告诉重写系统它使用mod_proxy。这对我有用,但我没有收到内部服务器错误。

这种方法的优势在于它使用Rewrite Engine,您可以更好地控制动态发送到脚本所需的变量。