(一些)webfonts 不使用 Heroku 通过 Cloudfront 加载

(Some) webfonts not loading through Cloudfront using Heroku

我在 Rails 上使用 Ruby 在 Heroku 上托管一个网站。它使用 Cloudfront 分发来提供资产,并使用 S3 来存储图像。

当转到 http://example.com 时,除了 2 个网络字体外,一切正常。所有其他字体加载正常。

当去 http://www.example.com, none 的 webfonts 加载。

has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.example.com' is therefore not allowed access.

我使用的是普通的 Cloudfront 资产主机 d12345.cloudfront.net,但我想如果我切换到 assets.example.com,我会解决 CORS 问题。但我仍然得到:

Access to Font at 'http://assets.example.com/assets/myfont-Bold-735639b52225ec60e258c2b8b193dfb479f6158c3738a595db04f3a9684a4ad8.woff' from origin 'http://www.example.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://www.example.com' is therefore not allowed access.

```

我已经阅读了无数关于这个问题的讨论帖、博文和 SO 答案,但我似乎无法弄明白。

我在我的 rails 应用程序中设置 Rack::Cors 如下:

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'
    resource '/assets/*', headers: :any, methods: [:get]
  end
end

我的 asset_host 设置正确:

CLOUDFRONT_HOST = "http://assets.example.com"
config.action_controller.asset_host = CLOUDFRONT_HOST

所有其他资产都运行良好。图片 JavaScript、CSS 全部来自 CloudFront,没有任何问题。进入 www.example.com 子域时只有 2 种网络字体,而进入根级站点时只有 2 种网络字体 example.com.

我在 Cloudfront 和 S3 管理面板中尝试了很多选项:

但似乎没有任何效果。我不知道为什么这 2 种字体无法正确加载而其他一切正常。

字体通常由您的浏览器预检检查,并发出 OPTIONS 请求。在您的 CORS 设置中,除了 GET 之外,还尝试允许 OPTIONS。您可能还必须在 CloudFront 分配上允许 OPTIONS

请注意,如果这些字体在请求中有查询参数 url,如 assets.example.com/font.woff?v=123,CloudFront 分配也应转发查询参数。