【问题标题】:Dealing with assets and s3 buckets in Rails 4.2.1在 Rails 4.2.1 中处理资产和 s3 存储桶
【发布时间】:2015-05-13 08:07:37
【问题描述】:

我正在使用 assets_sync 从 S3 存储桶提供我的资产(css、js 和图像)。我无法加载我的 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 哈希字符串,因此在尝试访问此网址时是被禁止的。

这是我的资产同步配置

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

    控制这个的设置是

     config.assets.compress
    

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

    【讨论】:

    • 感谢您的回答,所以在 development 中澄清预编译时间戳时附加但在 production 中将附加 md5 校验和到文件名?
    • 基本上 compress=false 与预编译的概念冲突——这是根本原因。
    • 所以更改为 compress=true 会解决我的问题吗?那是在我想要的环境中设置的?
    • 我猜是这样 - 虽然正如所说的那样,这似乎是一件奇怪的事情
    • 好的,所以如果我这样做正确然后rake assets:precompile RAILS_ENV=production 然后测试所有生成的ok 将config.action_controller.asset_host = "https://#{ENV['FOG_DIRECTORY']}.s3.amazonaws.com" 添加到我的development.rb,这将更符合我的设置应该如何?我的目标只是测试我的所有资产都可以从我的 s3 存储桶中访问
    猜你喜欢
    • 2015-09-10
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 2021-10-03
    • 1970-01-01
    • 2023-02-01
    相关资源
    最近更新 更多