我使用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
有人对此有任何想法吗?
答案 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。