【问题标题】:cross site ajax using proxy not working使用代理的跨站点ajax不起作用
【发布时间】:2012-09-23 12:28:32
【问题描述】:

我正在尝试使用 tinyproxy 作为反向代理来进行跨站点 ajax。这是设置:

  • 一个运行 gentoo linux 的桌面系统。 IP 地址是 x.x.x.x。 Boa(Web 服务器,端口 80)和 tinyproxy(http 代理,端口 8888)正在此系统上运行。

这里是测试文件:

======= a.html ======

<html>
  <head>
    <meta charset="UTF-8" />
    <title>Ajax test</title>
  </head>
  <body>
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
    <script type="text/javascript" src="a.js"></script>
  </body>
</html>

======= a.js ========

$(document).ready( function() {

    function error_func()
    {
        alert("error occurred");
    }

    function ajax_func(data)
    {
        alert("ajax received");
    }

    $.get("http://x.x.x.x:8888/outside/xyz.txt", ajax_func).error(error_func);

});

我已经配置了 tinyproxy,以便 http://x.x.x.x:8888/outside/ 将转到 http://www.outside.com/。我控制了那个域,并在其中放置了一个文本文件 xyz.txt,其中包含“测试字符串”。

现在,当我将以下 url 放入 firefox:x.x.x.x:8888/xyz.txt 时,一切正常,我看到浏览器窗口中显示“测试字符串”。但是当我将 x.x.x.x/a.html 放入 Firefox 时,我得到了“发生错误”对话框。我已经在 IE、Safari、Firefox 和 Chrome 上尝试过这个,我在所有这些上都得到了“发生错误”对话框。

请注意,我知道“同源策略”,这就是我使用 tinyproxy 来绕过该限制的原因。

我在 gentoo linux 机器上使用了 wireshark 来观察流量。一切看起来都很好。我看到 firefox 和 x.x.x.x 之间的 HTTP 事务,然后我看到 x.x.x.x 和“外部”之间的 HTTP 事务,最后是 x.x.x.x 和 firefox 之间的另一个 HTTP 事务。 HTTP 200 OK 包含预期的“测试字符串”。但是,jquery 仍然不开心,我没有收到“收到 ajax”对话框...

我怀疑的一件事是 HTTP“服务器”标头。 x.x.x.x 系统显示“服务器:Boa”,但最终响应为“服务器:Apache”。我会因为这种差异而违反同源政策吗?

【问题讨论】:

  • 顺便说一句,我不能使用 JSONP,因为在我将使用的真实服务器(shoutcast)上,我没有任何控制权,而且他们的所有 API 都不支持 JSONP .这只是我为了建立基线而进行的一个简单测试。因此,如果我能够使用 jquery 检索 xyz.txt 文件,那么下一步就是使用相同的机制对 Shoutcast 进行 API 调用以检索 XML 数据
  • 也许这只是 SO 上的一个错字,但您在手动测试时谈论 x.x.x.x:8888/xyz.txt,在您的 javascript 文件中谈论 x.x.x.x:8888/outside/xyz.txt。这不是错误,对吧?
  • 你好 Roman,是的,这是一个错字...我无法添加完整链接(新用户),所以我不得不破坏周围的东西。

标签: jquery


【解决方案1】:

Ajax 通信必须在这三个条件下进行:

  1. 同一主机
  2. 相同的协议
  3. 同一个端口

所以从技术上讲,在不同端口之间进行通信时,您不能使用 Ajax 调用,但是有一个简单的解决方案。如果您定义一个 Access-Control-Allow-Origin 标头允许您从另一个主机/协议/端口获得访问权限,则可以忽略预设条件。

您必须确保允许您的网页通过正确的标头访问您的代理。

有关更多信息,我建议您阅读以下内容:https://developer.mozilla.org/en-US/docs/HTTP_access_control

【讨论】:

    【解决方案2】:

    同源策略限制访问:

    • 同一主机
    • 相同的协议
    • 相同的端口

    同样的来源策略也适用于您的案例,因为您尝试从 x.x.x.x:80 访问 x.x.x.x:8888

    您还需要通过同一端口传送内容。

    【讨论】:

    • 感谢您的回复。知道如何在同一主机上运行 Web 服务器和 http 代理,并以 80 作为传入端口吗?
    • @user1692262,这取决于您的服务器技术和您的需求...在 PHP 中可以像 echo file_get_contents('http://www.outside.com/'); 一样简单
    • 不幸的是,目标系统是一个嵌入式系统,运行 boa 作为 Web 服务器,并且唯一可用的 serer 技术是 cgi。我精通 C/C++ 开发,所以最坏的情况下我可以使用 libcurl 来实现shoutcast api 支持。但是嵌入式 CPU 已经超载,所以如果可能的话,我想使用客户端 PC CPU 周期来完成所有的广播 api 工作。我也是网络东西(html,js,jquery)的菜鸟
    【解决方案3】:

    大约一个月前,我问了几乎相同的问题。你可以在这里找到答案: Cross protocol cookie iFrame

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-30
      • 2010-12-20
      • 2018-06-19
      相关资源
      最近更新 更多