用JavaScript代替跨域请求

Hei*_*mus 2 javascript php ajax .htaccess cgi

我在一个名为的服务器上有一个JavaScript,kopernikus.science.net它想要访问另一个名为的服务器上的文件galileo.science.net.这是我想到的一个玩具示例:

code residing on  http://kopernikus.science.net/makecalendar.js :

    var request = new XMLHttpRequest();
    request.open("GET","galileo.science.net/calendar", false);
    request.send(null);
    document.getElementById("calendar").innerHTML =
        "<div>" + request.responseText.split('\n')[0] + "</div>";
Run Code Online (Sandbox Code Playgroud)

遗憾的是,由于现代Web浏览器的"相同原始策略",禁止脚本访问不同域上的数据.

当然,我的问题是:

我怎么能访问远程文件?

允许JavaScript之外的解决方案,例如镜像相关文件或调整.htaccess.我有什么选择?哪个需要Web服务器上的最少权限?

有问题的文件是vcalendar格式的日历,它会定期更改.我在共享主机上,没有sysadmin权限,但我可以运行PHP和CGI脚本,并可以更改.htaccess文件的某些部分.

T.J*_*der 8

一些选择:

  1. 如果您控制服务器并且您的用户将使用最新的Web浏览器,则可以使用CORS.遗憾的是,IE7或更低版​​本中没有CORS支持.在IE8中,它就在那里,但你必须使用XDomainRequest而不是XMLHttpRequest(其他浏览器,如Chrome和Firefox,完全透明地处理CORS XMLHttpRequest).
  2. 如果没有,您可以使用适用于所有浏览器的JSONP.
  3. 您可以使用它document.domain来指定这两个页面(如果它们实际上是同一science.net域的子域)位于同一个源中.这在浏览器中运行良好,但它的缺点是您首先必须将目标文档加载到窗口(可能是隐藏的iframe)才能访问它,因为目标文档必须设置document.domain(以显示它想要与你合作).
  4. 对于公共事物,另一种替代方法是使用YQL作为代理.
  5. 如果所有这些都失败了,您唯一真正的选择是在您查询的服务器上有一个代理脚本,然后使用服务器端代码从另一个域查询资源(因为此限制仅适用于客户端).

这些大致按照我使用它们的顺序列出.例如,如果您控制服务器并且知道您的客户将使用最新的浏览器,请使用CORS; 如果没有,请查看JSONP(虽然从下面的评论中,你可能不能); 如果不是这些,或许document.domain是答案; 等等,在列表中工作到最后的选择(代理).