簡體   English   中英

在 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 相比,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

在開發中(默認情況下)像 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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM