Ruby on rails Cloudfront CORS阻止字体

Ruby on rails Cloudfront CORS阻止字体,ruby-on-rails,heroku,passenger,cdn,amazon-cloudfront,Ruby On Rails,Heroku,Passenger,Cdn,Amazon Cloudfront,除了字体以外的所有资源都可以很好地加载, 每当我访问我的网站,我都会收到这样的信息: 在以下位置访问字体: '' 来自源“”已被CORS策略阻止:否 “Access Control Allow Origin”标头出现在请求的服务器上 资源。因此,不允许使用源“” 进入 正如您所看到的,CURL命令指示不存在头 curl -H "Origin: https://example.com" -I https://xxxxxxxxx.cloudfront.net/assets/fontawesome-w

除了字体以外的所有资源都可以很好地加载, 每当我访问我的网站,我都会收到这样的信息:

在以下位置访问字体: '' 来自源“”已被CORS策略阻止:否 “Access Control Allow Origin”标头出现在请求的服务器上 资源。因此,不允许使用源“” 进入

正如您所看到的,CURL命令指示不存在头

curl -H "Origin: https://example.com" -I https://xxxxxxxxx.cloudfront.net/assets/fontawesome-webfont.woff2
HTTP/1.1 200 OK
Content-Length: 77160
Connection: keep-alive
Status: 200 OK
X-Rack-Cache: stale, valid, store
Cache-Control: public, must-revalidate
Date: Fri, 14 Apr 2017 08:01:26 GMT
X-Content-Digest: d6f48cba7d076fb6f2fd6ba993a75b9dc1ecbf0c
ETag: "2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe"
X-Runtime: 0.366713
X-Request-Id: 87c9d883-e443-4756-86f9-66b40ed573f6
X-Powered-By: Phusion Passenger Enterprise 5.1.2
Server: nginx/1.10.2 + Phusion Passenger 5.1.2
Via: 1.1 vegur, 1.1 f0eecbf6390179377707b707ebaa1e8b.cloudfront.net (CloudFront)
Age: 86645
Vary: Accept-Encoding
X-Cache: Hit from cloudfront
X-Amz-Cf-Id: FNjQGvROcAdqT6u6PaN3OgEE34mnSsixHNm6WqzWq2boWWYYzVmZPw==
这是AWS原始配置

这就是包括上述来源的行为:

我甚至将机架COR包含在项目的初始设定者中,但没有运气

if defined? Rack::Cors
  Rails.configuration.middleware.insert_before 0, Rack::Cors do
    allow do
      origins '*'
      resource '/assets/*', headers: :any, methods: [:get, :post, :delete, :put, :patch, :options, :head], max_age: 0
    end
  end
end

为什么会这样?我如何修复它?提前谢谢。

我认为最常见的解决方案是使用
font\u资产
gem。配置非常简单。在
config/environments/production.rb
中添加此

config.font_assets = "http://YOUR_ASSET_HOST"

不幸的是,我无法更详细地解释这一点,但这正是我们在项目中使用的,而且效果很好。

我认为最常见的解决方案是使用
font\u资产
gem。配置非常简单。在
config/environments/production.rb
中添加此

config.font_assets = "http://YOUR_ASSET_HOST"
不幸的是,我无法更详细地解释这一点,但这正是我们在项目中使用的,而且它工作良好。

从5.0版开始,您不必添加类似
font\u资产的依赖项。要将
访问控制允许源代码
设置到您的字体中,只需将以下代码添加到
config/environments/production.rb

config.public_file_server.headers = {
  'Access-Control-Allow-Origin' => '*'
}
2018年7月25日更新

标头值也可以是特定域,如下所示:

config.public_file_server.headers = {
  'Access-Control-Allow-Origin' => 'https://www.example.org'
}
从5.0版开始,您不必添加像
font\u资产
gem这样的依赖项。要将
访问控制允许源代码
设置到您的字体中,只需将以下代码添加到
config/environments/production.rb

config.public_file_server.headers = {
  'Access-Control-Allow-Origin' => '*'
}
2018年7月25日更新

标头值也可以是特定域,如下所示:

config.public_file_server.headers = {
  'Access-Control-Allow-Origin' => 'https://www.example.org'
}

正如您所看到的,CURL命令指示不存在头。您还可以从标题中看到,此请求根本没有通过CloudFront,因为
X-Amz-Cf-Id:…
Via:…CloudFront.net
X-Cache:。。。从cloudfront
中,所有标头都丢失,并且这些标头都不能被禁用。目前,CloudFront不是这个问题的一个促成因素。@MichaelSqlbot我更新了这篇文章。现在我有了这些标题。下一步我该怎么办?看来你搞错了。CloudFront不在循环中,所以我评论的重点是你没有CloudFront问题——问题出在其他地方:你的应用程序没有返回必要的CORS响应头。将CloudFront引入循环会使您的故障排除变得复杂,因为现在您看不到应用程序更改的影响——此响应基于
年龄:
标题,已经24小时了。禁用缓存并在
*
上运行缓存失效。是否有任何luck@BillyLogan可能重复?我有同样的问题…正如您可以看到的,CURL命令指示不存在任何头。您还可以从标题中看到,此请求根本没有通过CloudFront,因为
X-Amz-Cf-Id:…
Via:…CloudFront.net
X-Cache:。。。从cloudfront
中,所有标头都丢失,并且这些标头都不能被禁用。目前,CloudFront不是这个问题的一个促成因素。@MichaelSqlbot我更新了这篇文章。现在我有了这些标题。下一步我该怎么办?看来你搞错了。CloudFront不在循环中,所以我评论的重点是你没有CloudFront问题——问题出在其他地方:你的应用程序没有返回必要的CORS响应头。将CloudFront引入循环会使您的故障排除变得复杂,因为现在您看不到应用程序更改的影响——此响应基于
年龄:
标题,已经24小时了。禁用缓存并在
*
上运行缓存失效。是否有任何luck@BillyLogan可能重复?我有同样的问题…它与Rails 5兼容吗?不知道。自述文件说它适用于Rails 3.1,但它也适用于Rails 4.2,所以你可以试一试。它与Rails 5兼容吗?不知道。自述文件说它适用于Rails 3.1,但它也适用于Rails 4.2,因此您可以试一试。是否可以将“访问控制允许源代码”用于特定域而不是全部(*)?ie“mydomain1.com、mydomain2.com”是否可以将“访问控制允许源代码”用于特定域而不是所有(*)?例如“mydomain1.com,mydomain2.com”