css - IE9重定向缓存,字体和跨域资源共享(CORS)CDN HTTP header

标签 css amazon-s3 internet-explorer-9 font-face cors

我以为我有found a solution to the very vexing problem with Firefox and CDN-hosted fonts access,但是IE9来了。

我最近发现了一个非常令人沮丧的IE9缓存问题,并偶然发现了blog post (IE9 Redirect Caching Nightmare)这个问题,这使我对实际问题有了更多的了解。

我必须承认,我不确定上述内容是否确实是问题所在,但似乎已经足够接近了。

问题:

我有一个网站,该网站设置了两个指向同一服务器的域(基本域和子域),服务于完全相同的网站,该网站使用由Cloudfront提供的Amazon S3上托管的CDN的相同资源集。

https://example.com
https://www.example.com


使用@ font-face从CSS文件加载字体时,我在IE9开发人员工具控制台中收到以下类型的错误消息:

CSS3117: @font-face failed cross-origin request. Resource access is restricted.


当我先加载任何一个URL,然后第二次访问另一个URL时,就会发生这种情况。 IE9不在Compatibility Mode中运行。它正在Document Mode: IE9 Standards中运行。

从对CORS的有限了解以及设置Access-Control-Allow-Origin HTTP标头的需要出发,我尽职尽责地在S3 CORS策略中对其进行了设置,并且它与Firefox完美兼容。

来自两个域的请求在请求CDN资源时将获得其各自的标头。

似乎IE9尝试通过缓存进行一些优化,并且也缓存了重定向。
这也会引起问题,因为Access-Control-Allow-Origin标头也会被缓存。如果不向CDN服务器发送请求,则Access-Control-Allow-Origin标头不能在不同的域中更改。

因此,我遇到的情况是请求来自https://www.example.com,而Access-Control-Allow-Originhttps://example.com。这导致上面的错误消息的受限资源问题。

进一步查看:我使用Firefox 19进行了检查,实际上发生了上述情况,但是没有遇到与IE9相同的严格限制。子域(https://www.example.com)请求信息将接受主域(access-control-allow-origin)的https://example.com。 Chrome(Webkit)似乎并不在乎。我不知道哪种浏览器的行为实现是正确的。

使用CDN中的当前设置,似乎Chrome和Firefox会自动将所有www子域请求重新路由到主域。只有多次尝试在地址栏中输入www子域时,Chrome和Firefox才会服从。另一方面,IE9只会转到地址栏中键入的地址。 IE9似乎是一个奇怪的例子,但是我不确定哪个浏览器的行为实际上是正确的。

从可用性的角度来看,Chrome和Firefox似乎是“正确”的行为。

已知的可能解决方案:


设置Access-Control-Allow-Origin标头以允许所有内容,即*
关闭浏览器中的缓存
将一个域重定向到另一个域
使用查询字符串区分资源的不同域调用
将字体作为data-uri嵌入CSS


对于解决方案1,我们只说我很想设置特定的域即可。

对于解决方案2,如果要为所有浏览器进行设置都不是最佳选择,那么我的网站也必须在移动设备上运行,下载速度通常低于预期。

对于解决方案3,可能,但是我仍然对直接解决IE9缓存问题的解决方案感到好奇。

对于解决方案4,很难实现,尤其是当从@font-face调用资源时。这是否意味着我将不得不为不同行的不同域调用动态重新生成CSS,以仅加载字体来绕过此问题?似乎无法达到CSS本身的目的,并为此而缓存资源。

编辑:样式表有效,字体加载无效。

对于解决方案5,维护和更新非常繁琐,尤其是在定期更改字体文件时。

问题:在这种特殊情况下,是否有已知方法专门处理IE9的重定向缓存行为?

答案和评论非常感谢。提前致谢!

编辑:更多浏览器测试信息。

最佳答案

解决方案1:
检查this question

解决方案4:将CSS文件重命名为style.php,然后使用所需的任何代码来调用适当的资源。

在页面顶部设置内容类型。

<?php
    header("Content-type: text/css; charset: UTF-8");
?>


More info关于Chris Coyier的style.php。

关于css - IE9重定向缓存,字体和跨域资源共享(CORS)CDN HTTP header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15212453/

相关文章:

html - 仅使用 CSS3 的视差效果

amazon-s3 - 将 AWS API 网关重定向到 S3 二进制文件

java - 无法使用 java sdk 在 aws s3 上使用预签名 url 上传

ruby-on-rails - 使用 Asset Sync Gem 时 Heroku 上的 Slug 大小问题

c# - 安装 IE9 后使用 WebBrowser 控件的应用程序崩溃

html - Fontawesome 无法更改文件路径

html - Bootstrap 3 : images of same height displaying at different heights

css - Magento,从媒体文件夹添加 Css 文件

javascript - 从 ie8 迁移到 ie9

java - apache httpclient 并生成一个将使用 java 共享 session 的浏览器