【发布时间】: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