Rails 3.1资产管道中的背景图像问题与cloudfront CDN

时间:2012-11-11 23:59:12

标签: ruby-on-rails-3 heroku amazon-s3 cdn amazon-cloudfront

我有一个rails 3.1.0 heroku应用程序,它使用亚马逊cloudfront cdn来提供资产。除了背景图像之外,一切正常,它没有渲染。在firebug / Yslow节目中检查请求 GET box.png 403 Forbidden d2g4atxxxxxx.cloudfront.net 231 B 54.240.xxx.xxx:xx 并且图像的网址是http://d2g4xxxxxxxx.cloudfront.net/assets/box.png。正如您所看到的那样,图像不是指纹图像。在application.css中,我有background-image:url('box.png'); 我尝试过的事情

第一次尝试

我将.erb附加到application.css并添加了background-image:url(<%=asset_path 'box.png'%>); 然后我添加了config.action_controller.asset_host="http://mybucket_name.com.s3.amazonaws.com"
 然后我做了

bundle exec rake assets:precompile

然后我换回

config.action_controller.asset_host ="http://d2gxxxxxxx.cloudfront.net"

然后我做了

 git add application.css.erb
 git commit -a
 git push origin master

但它不起作用

第二次尝试

我将.scss附加到application.css并添加了background-image:image-url('box.png'); 然后我添加了config.action_controller.asset_host="http://mybucket_name.com.s3.amazonaws.com"
 然后我做了

bundle exec rake assets:precompile

然后我换回

config.action_controller.asset_host ="http://d2gxxxxxxx.cloudfront.net"

然后我做了

然后我将gem 'compass-rails'添加到gemfile并创建了compass.rb并添加了此

   #In compass.rb
  project_type = :rails
  line_comments = false
  generated_images_dir = "public/assets"


 bundle install
 git add application.css.scss  compass.rb
 git commit -a
 git push origin master

但它也不起作用

我有什么

的Gemfile

  source 'http://rubygems.org'

  gem 'rails', '3.1.0.rc8'


  group :development do
  gem 'sqlite3'
  end
  gem 'geocoder'
  gem "dynamic_form"
  gem 'devise'
  gem 'rack', '1.3.3'
  gem 'execjs'
  gem 'carrierwave'
  gem "meta_search",'>= 1.1.0.pre'
  gem "thumbs_up"
  gem 'geocoder'
  gem 'fog'
  gem 'koala'



   group :production do
   gem 'pg'
   gem 'therubyracer'
   gem 'unicorn'

   end
   gem 'jquery-rails'
   gem 'thin'

   gem 'mongrel', '1.2.0.pre2', :group => :development

   gem 'sass-rails', "  ~> 3.1.0.rc"
   gem 'coffee-rails', "~> 3.1.0.rc"
   gem 'uglifier'
   gem 'yui-compressor'
   gem "asset_sync"
  # gem 'compass-rails'


   group :test do
   # Pretty printed test output
   gem 'turn', :require => false
   gem 'rspec-rails'
   gem "factory_girl_rails"
   gem 'capybara'
   gem "guard-rspec"
   end

应用程序/配置/ enviroenments / production.rb

    Deals::Application.configure do

    config.cache_classes = true

   # Full error reports are disabled and caching is turned on
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true
  config.action_controller.asset_host ="http://d2g4xxxxxx.cloudfront.net"

  config.serve_static_assets = true

  # Compress JavaScripts and CSS
  config.assets.compress = true
   config.assets.compile = true
    config.assets.digest = true
   config.assets.css_compressor = :yui
    config.assets.js_compressor = :uglifier
      config.i18n.fallbacks = true
    config.active_support.deprecation = :notify
    end

问题

我做错了什么?或者我错过了什么步骤,有人可以指导我完成这些步骤吗?我花了整整一周阅读不同的博客和不同的问题,没有运气。谢谢提前

1 个答案:

答案 0 :(得分:4)

我使用CloudFront而不是S3使用自定义源。这意味着CloudFront指向您的Rails应用程序而不是S3。这将导致您的所有资产都为您设置版本,并可能解决您的问题。

这是一篇关于使用Rails Asset Pipeline时具有自定义起源的CloudFront的文章。您可以更多地了解相关主题:

http://blog.ertesvag.no/post/10720082458

这是另一个有更多信息的SO问题:

Rails 3 automatic asset deployment to Amazon CloudFront?