跨域脚本javascript请求

Cross domain scripting javascript request

本文关键字:请求 javascript 脚本      更新时间:2023-09-26

我正在开发一个ASP.NET MVC应用程序,该应用程序包括一个托管所有JavaScript、CSS和图像的网站,然后是使用该网站上托管的资源的主web应用程序。

假设资源url是resources.example.com,web应用程序url是webapp.example.com

其中一个JavaScript文件IE9.js(http://code.google.com/p/ie7-js/)为了工作,向CSS文件(resources.example.com/styles.CSS)发出请求,但由于请求是向另一个域发出的,因此会被阻止,这是因为同源策略(http://en.wikipedia.org/wiki/Same_origin_policy)。

我想我已经找到了解决这个问题的方法,使用resources.example.com网站的Access Control Allow Origin标头。我对此的理解是,这将允许向resources.example.com网站提出任何请求,前提是这些请求在标题中。

为了尝试这一点,我在网站的web.config中添加了标题,如下所示:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*"/>
  </customHeaders>
</httpProtocol>

我原以为这会允许任何请求运行权限,但当我通过IE9.js到达发出请求的点时,它在请求CSS文件resources.example.com/styles.CSS.时仍然会遇到PermissionDenied错误

CSS必须托管在另一个域上,IE9.js需要能够请求它。我相信答案是与这些HTTP头有关,但我可能误解了如何使用它们。

如对这个问题有任何见解,我们将不胜感激。顺便说一句,我应该补充一下,javascript文件是从谷歌代码网站链接到的:

<!--[if lt IE 9]>
<script src="http://ie7-js.googlecode.com/svn/version/2.1(beta4)/IE9.js"></script>
<![endif]-->

在条件注释中,这只是IE中的一个问题。任何解决方案都必须在IE7+中工作。

更新:

我已经成功地使用IE的XDomainRequest对象向CSS发出了请求。我现在得到的内容是gzip,所以我只需要解码它,我就应该离开了。我会发布一个完整的更新和答案,当我有它的工作。

更新:

除此之外,XDomainRequest对象似乎不支持修改Accept-Encoding标头,这意味着响应似乎总是以编码的方式返回,对此进行解码会减慢页面加载速度,感觉不太对劲。此外,XDomainRequest对象在IE7中似乎不受支持,IE7是必需的受支持浏览器。

我唯一能想到的另一件事是设置一个处理程序,IE9.js可以调用该处理程序,该处理程序将位于同一域上,并加载所需文件的内容。这感觉也不太好,但这是我目前唯一能想到的其他解决方案。欢迎任何其他建议。

解决此问题的另一种方法是在IIS前面放置反向代理(如Nginx)。

然后将locationproxy_pass添加到webapp.domain.com和resources.domain.com。这样,它默认为webapp.domain.com,但如果您使用webapp.domain.com/resources,它会转到resources.domain.com.

通过这种方式,客户端只要求一个来源,因此需要跨站点脚本。

在本地测试时,这个技巧也非常方便。

只是个主意。。。

为了解决这个问题,我修改了IE9.js文件,该文件请求调用主MVC web应用程序中的处理程序。然后,这个处理程序可以向IE9.js所需的资源发出请求,因此它不需要直接向资源站点发出请求。

在问题中概述的情况下,我无法找到另一个解决问题的方法。