ruby-on-rails - Firefox 不呈现来自 CloudFront 的字体

标签 ruby-on-rails firefox heroku amazon-s3 amazon-cloudfront

我有一个 rails 应用程序,托管于 Heroku .在部署期间, Assets 与 同步亚马逊 S3 桶通过 asset_sync gem 和 View 通过 调用这些 Assets 云前线 .但是,使用 查看网站时不会呈现字体。火狐 (文件加载在 Firebug 的网络选项卡中,但根本不使用)。 Safari 效果很好。

我有以下 CORS S3上的配置:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Content-*</AllowedHeader>
    <AllowedHeader>Host</AllowedHeader>
</CORSRule>
</CORSConfiguration>

我的应用程序还设置了以下标题:
Access-Control-Allow-Origin: *
Access-Control-Request-Method: *

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

最佳答案

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

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

有一个解决方法。 CloudFront 可以指向另一台可以发送 Access-Control-Allow-Origin 的服务器。 header (您可以使用为您的应用提供服务的服务器 ;) 来做到这一点)。

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

示例:

Path Pattern: /assets/*.woff

准备好后,您可以使用以下方法验证 header 是否存在:
curl -I http://cloudfrontid.cloudfront.new/assets/font.woff

希望您会看到 Access-Control-Allow-Origin header ,由您的服务器与文件本身一起提供,由 CloudFront 缓存并包含 header 。

希望有帮助!

关于ruby-on-rails - Firefox 不呈现来自 CloudFront 的字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19006305/

相关文章:

javascript - rails : jQuery works in localhost but not in production on heroku

ruby - 如何使用 Mongoid3 为 15k 用户解决 "out of memory"错误和 'heroku run console'?

ruby-on-rails - 调用方法,在Application controller中定义,在其他controller中

ruby-on-rails - gitlab ci错误无法将主机名 "postgres"转换为地址: Name does not resolve

c++ - 脚本插件 : Error calling method on NPObject

html - 在 Firefox 中使用 css 转换时边框渲染不正确

git - 部署到 Heroku : freezes up during "writing objects"

ruby-on-rails - 无法批量分配 protected 属性 : confirmed_at

ruby-on-rails - 在 Rails 中设置多个多对多关系的最佳方法是什么?

CSS3 Firefox滤镜灰度无模糊效果矩阵