rails 使用 S3 和云端配置 carrierwave

rails configuring carrierwave with S3 and cloudfront

我有一个 Rails4 应用程序,我正在尝试将 CDN 添加到 S3 上传。由于某种原因,它不起作用。

当我出于某种原因在配置中设置云端时,它仅对属于同一上传者的一些图像(不是全部)有影响,并且最重要的是这些图像已损坏。从 S3 显示的图像可以正常工作,但它们也应该从云端提供。

我错过了什么?

通过云端显示(损坏)的图像:

<%= image_tag current_user.avatar.url(:small_thumb), class: 'navbar-avatar', alt: "#{current_user.first_name}'s_avatar", title: "#{current_user.first_name}'s avatar" %>    

https://xyz.cloudfront.net/images/xyz.cloudfront.net/uploads/profile/avatar/3/small_thumb_3f4ff02.jpg

出于某种原因从 S3 而不是云端显示的来自同一上传者的图片(显示未损坏)

<%= image_tag post.user.avatar.url(:base_thumb), class: 'post-avatar' %>

https://eaxmple.s3.amazonaws.com/uploads/profile/avatar/10/base_thumb_john_smith.png

配置:

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider:              'AWS',
    aws_access_key_id:     ENV['AWS_ACCESS_KEY_ID'],
    aws_secret_access_key: ENV['AWS_SECRET_ACCESS_KEY']                        
  }
  config.fog_directory  = ENV['S3_BUCKET_NAME']
  config.fog_attributes = { 'Cache-Control' => "max-age=#{365.day.to_i}" }
  config.asset_host = ENV['CLOUDFRONT_URL']
end

avatar_uploader.rb

if Rails.env.production?
  storage :fog
else
  storage :file
end

gemfile

gem 'carrierwave', '~> 0.10.0'
gem 'fog', '~> 1.34.0'
gem 'mini_magick', '~> 4.3.3'

更新

上传器默认存储:

def store_dir
  "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
end

我该如何更改:

https://xyz.cloudfront.net/images/xyz.cloudfront.net/uploads/profile/avatar/3/small_thumb_3f4ff02.jpg

对此:

https://xyz.cloudfront.net/uploads/profile/avatar/3/small_thumb_3f4ff02.jpg

看起来您可能需要将协议添加到云端 url:

CLOUDFRONT_URL=https://xyz.cloudfront.net