未提供Rails Cloudfront资产

时间:2016-02-11 10:39:34

标签: ruby-on-rails heroku amazon-cloudfront

我使用Heroku for Rails设置Cloudfront,并且在开始时它运行良好。我注意到在最后几天,资产不再从cloudfront.net提供。

Production.rb

Rails.application.configure do
  config.cache_classes = true
  config.eager_load = true
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true
  config.action_controller.asset_host = 'http://d2t6o5tnu5etuf.cloudfront.net'
  config.serve_static_files = true
  config.assets.js_compressor = :uglifier
  config.assets.css_compressor = :sass
  config.assets.compile = true
  config.assets.digest = true
  config.assets.version = '1.0'
  config.log_level = :info
  config.i18n.fallbacks = true
  config.active_support.deprecation = :notify
  config.log_formatter = ::Logger::Formatter.new
  config.active_record.dump_schema_after_migration = false
end

我可以通过云端地址访问我的所有资产,并且在chrome中我可以看到应用程序从云端服务器获取应用程序 - 5deb6995ce9b984d469b27c58cc92a095d19cd13e0acd622ffe426c41826e055.js。但是,页面上的所有静态图像,例如/assets/shop/banners/2.jpg没有。

它似乎与预编译有关,因为它不寻找文件的指纹版本,或者?

在我的gem文件中,我有以下内容:

group :production, :staging do
      gem 'rails_12factor'
      gem 'pg'
 end

2 个答案:

答案 0 :(得分:1)

由于tegon意外,需要image_tag或image_url来为来自cloudfront的资产提供服务。我的代码中有通常的“img src”引用,无法识别。

将img src更改为image_tag或image_url,它正常运行。谢谢!

答案 1 :(得分:0)

以下是使用CloudFront的示例Rails 5.2应用程序。:https://github.com/nzoschke/edgecors

除了asset_host之外,您还应该为资产配置Cache-Control标头。这样一来,CloudFront几乎可以永远缓存不可变的application-5deb6995ce9b984d469b27c58cc92a095d19cd13e0acd622ffe426c41826e055.js命名资产。

Rails.application.configure do
  config.action_controller.asset_host = "https://d372g5jsa84e2.cloudfront.net"
  config.public_file_server.headers = {
    'Cache-Control' => 'public, max-age=31536000'
  }
end

如上所述,请使用资产管道url助手。这是SCC font-url助手的示例:

@font-face {
  font-family: 'Inconsolata';
  src: font-url('Inconsolata-Regular.ttf') format('truetype');
  font-weight: normal;
  font-style: normal;
}

body {
  font-family: "Inconsolata";
}