我以为我有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-Origin
是https://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/