在 Rails 4.2.1 中处理资产和 s3 存储桶
Dealing with assets and s3 buckets in Rails 4.2.1
我正在使用 asset_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 哈希字符串,因此在尝试访问此 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.2.1 与 Rails 4 相比有什么变化吗?
这跟这有关系吗? 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
在开发中(默认情况下)javascripts 和 css 之类的东西是单独加载的,而不是合并到一个文件中。例如,如果 application.js 有
//= require jquery
//= require something.js
然后在开发中 javascript_tag :application
将为这两个文件插入单独的 <script>
标签,附加时间戳而不是 md5 校验和,而不是对组合 application.js 的单个请求文件
S3 中不存在这些单独的文件,您将收到 403(这是 403 而不是 404,因为如果您没有列出存储桶的权限,则默认情况下会导致不存在的对象请求在 403 错误中)。
图像不受此影响,因为没有等效的将图像组合在一起的东西(除非你使用 gem 自动处理 css 精灵)
控制这个的设置是
config.assets.compress
然而,这似乎是一个非常奇怪的开发设置,其中对资产的任何更改都需要您将它们推送到 s3。
我正在使用 asset_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 哈希字符串,因此在尝试访问此 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.2.1 与 Rails 4 相比有什么变化吗?
这跟这有关系吗? 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
在开发中(默认情况下)javascripts 和 css 之类的东西是单独加载的,而不是合并到一个文件中。例如,如果 application.js 有
//= require jquery
//= require something.js
然后在开发中 javascript_tag :application
将为这两个文件插入单独的 <script>
标签,附加时间戳而不是 md5 校验和,而不是对组合 application.js 的单个请求文件
S3 中不存在这些单独的文件,您将收到 403(这是 403 而不是 404,因为如果您没有列出存储桶的权限,则默认情况下会导致不存在的对象请求在 403 错误中)。
图像不受此影响,因为没有等效的将图像组合在一起的东西(除非你使用 gem 自动处理 css 精灵)
控制这个的设置是
config.assets.compress
然而,这似乎是一个非常奇怪的开发设置,其中对资产的任何更改都需要您将它们推送到 s3。