我正在开发一个 ASP.NET MVC 应用程序,它包含一个托管所有 JavaScript、CSS 和图像的网站,然后是使用托管在该网站上的资源的主要 Web 应用程序。
假设资源 url 是 resources.example.com,网络应用程序 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 header 。我对此的理解是,这将允许向 resources.example.com 网站发出的任何请求,前提是它们在该 header 中。
为了尝试这个,我将 header 添加到网站的 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 header 有关,但我可能误解了如何使用它们。
如果您对此问题有任何见解,我们将不胜感激。顺便说一句,我应该补充一点,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 header ,这意味着响应似乎总是以编码和解码的方式返回,这会减慢页面加载速度并且不会感觉不错。此外,IE7 似乎不支持 XDomainRequest 对象,而 IE7 是必需的受支持浏览器。
我唯一能想到的另一件事是设置一个 IE9.js 可以调用的处理程序,它将位于同一域中并加载所需文件的内容。这也感觉不太好,但这是我目前能想到的唯一其他解决方案。欢迎任何其他建议。
最佳答案
解决这个问题的另一种方法是在 IIS 前面放置一个反向代理(例如 Nginx)。
然后将 location proxy_pass 添加到 webapp.domain.com 和 resources.domain.com。以这种方式,它默认为 webapp.domain.com,但如果您使用 webapp.domain.com/resources,它将转到 resources.domain.com。
通过这种方式,客户端仅请求一个来源,因此在跨站点脚本中。
这个技巧在本地测试时也非常方便。
只是一个想法...
关于javascript - 跨域脚本javascript请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9130543/