Rails 4 - 使用 Cloudfront 和 Paperclip

Rails 4 - use cloudfront with Paperclip

我有一个应用程序已经可以(在暂存和生产中)使用 S3。
现在我们希望它与 cloudfront 一起工作。

我发现出于某种原因我在两个地方有回形针定义:

/confog/initializers/paperclip.rb:

if Rails.env.production? || Rails.env.staging? || true
  Paperclip::Attachment.default_options[:url] = ':s3_domain_url'
  Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename'
end

/config/environments/staging.rb/config/environments/production.rb

config.paperclip_defaults = {
  :storage => :s3,
  :s3_credentials => {
    :bucket => s3_options[:bucket],
    :access_key_id => s3_options[:access_key_id],
    :secret_access_key => s3_options[:secret_access_key]
  }
}

(我从我拥有的 s3.yml 文件加载 s3_options

第一个问题 - 这两个地方是否有必要(或者说是错误的)配置?

使用这个配置我得到这个:

> Profile.last.image.url
=> "https://mybucket.s3.amazonaws.com/profiles/images/000/000/001/original/someimage.jpg?1439912576"

我的目标: 获取 cloundfront url 而不是 s3.

我尝试了几种方法:

  1. 添加到paperclip.rb这一行:

    Paperclip::Attachment.default_options[:s3_host_alias]  = "xxxxx.cloudfront.net"
    

    (其中 xxxxx 代表云端哈希)。
    结果:没有任何改变。

  2. 添加到paperclip.rb这一行:

    Paperclip::Attachment.default_options[:s3_host_name]  = "xxxxx.cloudfront.net"
    

    (其中 xxxxx 代表云端哈希)。
    结果:回形针连接存储桶名称之前它:

    > Profile.last.image.url
    => "https://mybucket.xxxxx.cloudfront.net/profiles/images/000/000/001/original/someimage.jpg?1439912576"
    
  3. paperclip.rb中禁用配置并将这些行添加到环境配置文件中(我在[=116上试过了=]):

    config.paperclip_defaults = {
           :
      :s3_credentials => {
         :
         :
        :url => "xxxxx.cloudfront.net",
        :s3_host_name => "xxxxx.cloudfront.net",
        :path => '/:class/:attachment/:id_partition/:style/:filename',
      }
    }
    

    结果:回形针连接存储桶名称之后:

    > Profile.last.image.url
    => "https://xxxxx.cloudfront.net/mybucket/profiles/images/000/000/001/original/someimage.jpg?1439912576"
    
  4. 如 (3),但将这些行添加到更高一级:

    config.paperclip_defaults = {
      :storage => :s3,
      :url => "xxxxx.cloudfront.net",
      :s3_host_name => "xxxxx.cloudfront.net",
      :path => '/:class/:attachment/:id_partition/:style/:filename',
      :s3_credentials => {
         :
         :
      }
    }
    

    结果:同(3).

简单地说,无论我在 :s3_host_name 中放入什么,paperclip 在某个地方连接存储桶名称

有什么想法吗?

比我想象的要容易。
看起来回形针使用 :url 作为字符串或作为指示如何构造 url.

的符号的参考

在我的 /config/environments/staging.rb/config/environments/production.rb 文件中,我现在有:

config.paperclip_defaults = {
  :storage => :s3,
  :url => ':s3_alias_url',
  :s3_host_alias => "xxxxx.cloudfront.net",
  :path => '/:class/:attachment/:id_partition/:style/:filename',
  :s3_credentials => {
       :
       :
  }
}

结束使用:

  amazon = AppConfiguration.for :amazon

  config.paperclip_defaults = {
    storage: :s3,
    url: ':s3_alias_url',
    s3_host_alias: amazon.cloudfront,
    path: '/:class/:attachment/:id_partition/:style/:filename',
    s3_protocol: :https,
    s3_credentials: {
      bucket: amazon.s3_bucket_name,
      access_key_id: amazon.aws_access_key_id,
      secret_access_key: amazon.aws_secret_access_key
    }
  }

替代 AppConfiguration

config.paperclip_defaults = {
  storage: :s3,
  url: ':s3_alias_url',
  s3_host_alias: ENV['AMAZON_CLOUDFRONT'],
  path: '/:class/:attachment/:id_partition/:style/:filename',
  s3_protocol: :https,
  s3_credentials: {
    bucket: ENV['AMAZON_S3_BUCKET_NAME'],
    access_key_id: ENV['AMAZON_AWS_ACCESS_KEY_ID'],
    secret_access_key: ENV['AMAZON_AWS_SECRET_ACCESS_KEY']
  }
}

重要的是,不要在这里使用Rails.application.secrets。在 rails 4.1.8 至少

上加载配置文件时不可用