Firefox不会从CloudFront渲染字体

我有一个Rails应用程序,托管在Heroku上 。 在部署期间,资产通过asset_sync gem与Amazon S3存储桶同步,并且视图通过CloudFront调用这些资产。 但是,使用Firefox查看网站时不会呈现字体(文件在Firebug的“网络”选项卡中加载,但根本不使用)。 Safari很棒。

我在S3上有以下CORS配置:

    * GET 3000 Content-* Host   

我的应用程序还设置了以下标题:

 Access-Control-Allow-Origin: * Access-Control-Request-Method: * 

CloudFront返回没有它们的字体…为什么没有加载字体? 提前致谢。

某些版本的Internet Explorer和Firefox认为字体是攻击媒介,如果它们由另一个域提供(跨域策略),则会拒绝加载它们。

在标准HTTP服务器上,您需要做的就是添加Access-Control-Allow-Origin: *标头以绕过CORS策略。 问题是S3不支持发送它。 (虽然根据规范,它应该支持CORS,但不会发送标头)。

有一个解决方法。 CloudFront可以指向另一个可以发送Access-Control-Allow-Origin标头的服务器(您可以使用为您的应用程序提供服务的服务器执行此操作;) )。

这可以通过从AWS控制台向您的CloudFront分配添加自定义原点来完成。 接下来,您必须使用字体类型和新添加的Origin添加Behaviors 。 您可以使用通配符作为文件名。 (对于您拥有的每种字体类型,您需要执行一次此操作)。

例:

 Path Pattern: /assets/*.woff 

准备就绪后,您可以使用以下命令validation标题

 curl -I http://cloudfrontid.cloudfront.new/assets/font.woff 

希望您将看到由服务器提供的Access-Control-Allow-Origin标头以及文件本身,由CloudFront缓存并包含标头。

希望能帮助到你!

尝试在Cloudfront中使您的(缓存)字体文件无效: http ://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html#invalidating-objects-console

我今天遇到了类似的问题。 我读了一篇文章 ,建议在CloudFront中缓存CORS配置。 我通过使我的字体文件无效来解决我的问题。

2014年6月26日,AWS在CloudFront中添加了对CORS的支持,因此现在您只需使用CloudFront和S3即可实现此function。

此SO答案提供有关为特定CloudFront分发启用CORS支持的信息: https : //stackoverflow.com/a/24459590/3195497

此外,您需要在S3存储桶上启用CORS。 这里的答案之一就S3而言:

虽然根据规范它应该支持CORS,但是不发送头

从我的测试来看,这只是部分正确。 如果在请求中发送了Origin标头,则S3将正确发送Access-Control-Allow-Origin标头。 如果发送Origin标头,则S3将发送Access-Control-Allow-Origin标头。

过去,这会导致CloudFront出现问题。 如果您在没有Origin请求标头的情况下向CloudFront发出任何请求,则CloudFront将缓存没有Access-Control-Allow-Origin响应标头的响应。 这可能是因为您使用curl命令测试资产而您没有包含Origin请求标头。 现在,当您使用Origin标头向CloudFront发出请求时,CloudFront将忽略Origin标头并在没有Access-Control-Allow-Origin标头的情况下提供缓存的响应。

通过最近发布到CloudFront的更改,您可以配置您的分发以考虑Origin请求标头。 在这种情况下,CloudFront将缓存不同的响应,对Origin标头的每个值都有一个响应。

这就是我的CORS配置的样子。 我有一个与你不同的AllowedHeader。 我不使用asset_sync。

    * GET 3000 Authorization