处理资产和s3桶Rails 4.2.1

时间:2015-05-13 08:07:37

标签: css ruby-on-rails ruby ruby-on-rails-4 amazon-s3

我使用asset_sync从S3存储桶提供我的资产(css,js和images)。我无法加载我的CSS / JS(我得到403禁止错误)但图像加载正常。我想我已经找到了这个问题(它看起来不像它的存储桶或IAM权限)。

当我上传资源时,会按照

的方式生成文件名
mybucket.s3.amazonaws.com/assets/application-123456789101112.css

然而,当我的应用程序尝试调用css文件时,它尝试获取的url就像

mybucket.s3.amazonaws.com/assets/application.self-573489573934.css

主要区别在于包含self和完全不同的MD5哈希字符串,因此在尝试访问此URL时禁止它。

这是我的asset_sync配置

if defined?(AssetSync)
  AssetSync.configure do |config|
    config.fog_provider = 'AWS'
    config.aws_access_key_id = ENV['AWS_ACCESS_KEY_ID']
    config.aws_secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
    config.fog_directory = ENV['FOG_DIRECTORY']
    config.existing_remote_files = "delete"
    config.gzip_compression = true
    config.manifest = true
    config.custom_headers = { '.*' => { cache_control: 'max-age=315576000', expires: 1.year.from_now.httpdate } }
  end
end

我也认为问题可能在于我的环境设置。与Rails 4相比,rails 4.2.1中的内容发生了变化吗?

这与它有什么关系吗? https://github.com/thoughtbot/paperclip/issues/1772

在我的development.rb中(因为我现在只在本地测试)我有

config.assets.compile = true
config.assets.digest = true
config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present? # Never seen this one before

有人对此有任何想法吗?

1 个答案:

答案 0 :(得分:1)

在开发中(默认情况下)javascripts和css之类的东西是单独加载的,而不是合并到一个文件中。例如,如果application.js有

//= require jquery
//= require something.js

然后在开发中javascript_tag :application将为这两个文件插入单独的<script>标记,附加时间戳而不是md5校验和,而不是对组合的application.js文件的单个请求

这些单独的文件不存在于S3中,您获得403(它是403而不是404,因为如果您没有权限列出存储桶,那么对不存在的对象的默认请求导致403错误。)

图像不受此影响,因为没有等效的图像组合在一起的东西(除非您使用宝石自动处理css sprites)

控制它的设置是

 config.assets.compress

然而,这似乎是一个非常奇怪的开发设置,对资产的任何更改都要求您将它们推送到s3。