对不同主机的ajax请求

Posted

技术标签:

【中文标题】对不同主机的ajax请求【英文标题】:ajax request to different host 【发布时间】:2010-12-28 07:57:19 【问题描述】:

我的网页中有以下 javascript

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://www.google.com', true);
xhr.onreadystatechange = function() 
  if (xhr.readyState == 4) 
    alert('resp received, status:' + xhr.status + ', responseText: ' + xhr.responseText);
                                                                         
;                                                                        
xhr.send(null);                                                           

这将执行并完成,readyState 为 4,状态为 0,responseText 和 responseXML 为空。我知道它实际上是在发送请求 b/c 我尝试将 xhr 发送到我机器上的服务器,而服务器实际上确实响应了。为什么我在 responseText 中没有得到任何东西? xhr 将转到不同的服务器这一事实是否与此有关?

当我打开 js 调试器并输入“xhr”来检查对象时,我得到了这个:

XMLHttpRequest 完成:4 HEADERS_RECEIVED:2 正在加载:3 已开业:1 未发送:0 中止:函数中止() addEventListener: 函数 addEventListener() dispatchEvent: 函数 dispatchEvent() getAllResponseHeaders: 函数 getAllResponseHeaders() getResponseHeader: 函数 getResponseHeader() onabort:空 错误:空 加载:空 onloadstart:空 进度:空 onreadystatechange: 函数 () 打开:函数打开() overrideMimeType: 函数 overrideMimeType() 就绪状态:4 removeEventListener: 函数 removeEventListener() 响应文本:“” 响应XML:空 发送:函数发送() setRequestHeader: 函数 setRequestHeader() 状态:0 状态文本:“” 上传:XMLHttpRequestUpload withCredentials: false

【问题讨论】:

【参考方案1】:

它有什么事情要做吗? 事实上,xhr 将走向 不同的服务器?

是的,您不能通过 AJAX 向其他服务器发送请求。然而,您可以从服务器端发送您的请求。因此,您需要实施以下工作流程: 您的页面 -> 您的服务器 -> 第三方服务器 -> 您的服务器 -> 您的页面,其中“->”表示发送数据。

【讨论】:

+1 一个有效的非常简单的代理。我使用 CURL 在 php 中编写了其中一个。【参考方案2】:

如果服务器配置为允许跨域请求,您可以进行跨域请求:请参阅How does Access-Control-Allow-Origin header work? 和谷歌关于 Access-Control-Allow-Origin 标头的信息。

【讨论】:

【参考方案3】:

跨站脚本是一种将代码注入他人网页的常用方法。为了限制这一点,大多数浏览器现在阻止客户端开发人员向位于与原始页面不同域的网页创建 JavaScript 请求(通常通过 XMLHttpRequest)。

您可以通过在您的域上创建一个虚拟脚本来解决此问题,该脚本将相同的请求转发到您真正想要的页面。例如,在您的情况下,您将创建一个对 http://mydomain.com/google.php(或您喜欢的任何脚本语言)的请求,然后使用 file_get_contents 或类似的方式下载 Google 页面,然后只需使用 echo 即可。

【讨论】:

【参考方案4】:

您不能使用 javascript 进行跨域请求。解决此问题的最佳方法是将您的服务器用作代理。

【讨论】:

以上是关于对不同主机的ajax请求的主要内容,如果未能解决你的问题,请参考以下文章

我可以对不同的门户使用 ajax GET 请求吗?

使用ajax请求遇到的跨域问题

ajax处理错误

Internet Explorer 9 AJAX 请求上没有会话 Cookie

Ajax Post请求失败[重复]

PHP:对 XML 的 AJAX 请求