我有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();
}
我该怎么做才能解决这个问题?
答案 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
,您可以更好地控制动态发送到脚本所需的变量。