【问题标题】:Making an AJAX request to another server向另一台服务器发出 AJAX 请求
【发布时间】:2011-02-20 12:35:44
【问题描述】:

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

我能做些什么来解决这个问题?

【问题讨论】:

标签: javascript ajax


【解决方案1】:

您好像碰到了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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        【解决方案4】:

        您可以使用dynamic script loading。这是我写的一篇文章。

        【讨论】:

        • 我不想听起来像个混蛋,但您的文章只是一本书中的代码。此外,它没有详细说明另一端特别需要支持这种类型的脚本加载,这并不全面。 -1
        • 你是什么意思这不能全面工作?你能给我一个场景吗?这是执行跨域“类 ajax”请求的唯一方法,因为相同的源策略...
        猜你喜欢
        • 1970-01-01
        • 2018-08-22
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 2016-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多