2

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

  • 一个运行gentoo linux的桌面系统。IP 地址是 xxxx 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://xxxx:8888/outside/将转到http://www.outside.com/。我控制了那个域,并在那里放置了一个文本文件 xyz.txt,其中包含“测试字符串”。

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

请注意,我知道“同源政策”,这就是为什么我使用 tinyproxy 来解决这个限制。

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

我怀疑的一件事是HTTP“服务器”标头。xxxx 系统说“服务器:Boa”,但最终的响应是“服务器:Apache”。我会因为这种差异而违反相同的原产地政策吗?

4

3 回答 3

1

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

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

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

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

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

于 2012-09-23T12:55:41.533 回答
0

同源策略限制访问:

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

相同的来源策略也适用于您的情况,因为您尝试x.x.x.x:8888x.x.x.x:80.

您还需要通过同一端口交付内容。

于 2012-09-23T12:52:15.373 回答
0

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

于 2012-09-23T12:58:12.567 回答