跨域脚本javascript请求

时间:2012-02-03 14:51:27

标签: javascript asp.net-mvc-3 http cross-domain

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

让我们说资源网址是resources.example.com,网络应用网址是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)。

我以为我已经找到了解决方法,使用Access-Control-Allow-Origin标头到resources.example.com网站。我对此的理解是,这将允许对resources.example.com网站发出的任何请求都被允许,前提是它们位于该标题中。

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

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

我认为允许任何请求运行权限,但是当我通过IE9.js逐步执行请求时,它仍然会在请求CSS文件resources.example.com/styles时捕获到PermissionDenied错误。的CSS。

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 +中工作。

更新

我已经使用XDomainRequest对象成功向CSS发出了请求。我现在回来的内容是gzip,所以我只需要解码它,我应该离开。我会发布一个完整的更新并在我工作时回答。

更新

除了最后,XDomainRequest对象似乎不支持能够修改Accept-Encoding标头,这意味着响应似乎总是被返回编码并解码这将减慢页面加载而不会感觉正确。此外,似乎IE7中不支持XDomainRequest对象,IE7是必需的支持浏览器。

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

2 个答案:

答案 0 :(得分:1)

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

然后将位置proxy_pass添加到webapp.domain.com和resources.domain.com。以这种方式默认为webapp.domain.com,但如果您使用webapp.domain.com/resources,则会转到resources.domain.com。

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

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

只是一个想法......

答案 1 :(得分:0)

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

在问题中概述的情景中,我无法找到问题的另一种解决方案。