【问题标题】:Carrierwave+fog+s3 not working with Cloud Front URLsCarrierwave+fog+s3 不适用于 Cloud Front URL
【发布时间】:2012-11-11 18:04:05
【问题描述】:

我在使用 carrierwave+fog+s3 和 Amazon cloud front 时遇到了这个问题。通过以下设置,我可以将文件上传到 s3,但上传后,我从我的 rails 应用程序获得的 S3 对象 URL 没有基于 assets_host 的 URL,即我正在使 URL 看起来像这种格式 https://mycloudfrontname.cloudfront.net/uploads/myfile.mp3

但是都以这种格式出现https://mybucketname.s3.amazonaws.com/uploads/myfile.mp3

这里可能有什么问题?

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',
    :aws_access_key_id      => 'XXXX',
    :aws_secret_access_key  => 'XXXX',
    :region                 => 'us-east-1'
  }
  config.fog_directory  = 'mybucketname'
  config.asset_host     = 'https://mycloudfrontname.cloudfront.net'
  config.fog_public     = false
  config.fog_attributes = {'Cache-Control' => 'max-age=315576000'}
end

更新:

我从 Carrierwave 的 /lib/carrierwave/storage/fog.rb 中找到了这个代码位 - 所以如果我们在上面的代码 sn-p 上设置 asset_host,这一定可以正常工作吗?还是我还必须做任何其他配置?

def public_url
          if host = @uploader.asset_host
            if host.respond_to? :call
              "#{host.call(self)}/#{path}"
            else
              "#{host}/#{path}"
            end
          else
            # AWS/Google optimized for speed over correctness
            case @uploader.fog_credentials[:provider]
            when 'AWS'
              # if directory is a valid subdomain, use that style for access
              if @uploader.fog_directory.to_s =~ /^(?:[a-z]|\d(?!\d{0,2}(?:\d{1,3}){3}$))(?:[a-z0-9\.]|(?![\-])|\-(?![\.])){1,61}[a-z0-9]$/
                "https://#{@uploader.fog_directory}.s3.amazonaws.com/#{path}"
              else
                # directory is not a valid subdomain, so use path style for access
                "https://s3.amazonaws.com/#{@uploader.fog_directory}/#{path}"
              end
            when 'Google'
              "https://commondatastorage.googleapis.com/#{@uploader.fog_directory}/#{path}"
            else
              # avoid a get by just using local reference
              directory.files.new(:key => path).public_url
            end
          end
        end

【问题讨论】:

  • 您是否尝试过应用配置更新?
  • 你找到答案了吗?
  • 我也遇到了同样的问题。我的配置和你的差不多。出于某种原因,在我的开发环境中,我得到了像 http://assets/mycloudfrontname.cloudfront.net/uploads/myfile.mp3 这样的 URL,它是生产的,它们是 s3 的 URL。顺便说一句,如果你有#asset_host,你不应该需要#fog_directory。 FWIW 我也试过#fog_public = true,但无济于事。我今天花了大约 5 个小时,在线研究,研究 github 并逐步浏览carrierwave 代码。我无法对它做出正面或反面。

标签: ruby-on-rails amazon-s3 amazon-cloudfront fog


【解决方案1】:

config.fog_public 更改为true 并添加config.asset_host = 'YOUR_CND_ADDRESS'。当fog_public 为假时,asset_host 不起作用

【讨论】:

    【解决方案2】:

    在您的环境文件中,您需要设置资产主机。只需将下面的行添加到您的config/environments/production.rb 文件中,就可以了。还可能需要确保您使用的是最新版本的carrierwave 和fog gem。

    -- config/environments/production.rb
    
    Myapp::Application.configure do
    
      # Use Content Delivery Network for assets
      config.action_controller.asset_host = 'https://mycloudfrontname.cloudfront.net'
    
    end
    

    【讨论】:

      【解决方案3】:

      不要使用asset_host。 asset_host 设置用于由 rails 资产助手提供的文件。 CarrierWave 文件以不同的方式处理。您要查找的配置是 config.fog_host

      config.fog_host = 'https://mycloudfrontname.cloudfront.net'
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 2012-03-21
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      相关资源
      最近更新 更多