在Rails 3中配置动态assets_host

Oks*_*ana 4 ruby-on-rails ruby-on-rails-3

我希望Rails 3根据当前域动态获取资产:

mysite.com - assets.mysite.com mysite.ru - assets.mysite.ru

开箱即可吗?或者我应该手动实现它?

Ric*_*son 12

尝试将proc发送到asset_host,它会产生资产路径和请求:

config.action_controller.asset_host = proc {|path, request|
  "http://assets." << request.host
}
Run Code Online (Sandbox Code Playgroud)

  • 通过包含http,您可以限制页面以包含来自非SSL/https源的资源.考虑到您的页面可能是SSL,让rails添加适当的架构并不是一个坏主意. (3认同)

Pep*_*ppy 9

请注意以下解决方案中与其他解决方案的主要区别:

  1. 使用request.domain而不是request.host,因为大多数资产主机不是assets0.www.domain.com而是assets0.domain.com
  2. 使用source.dash和modulo将确保从同一资产服务器提供相同的资产.这是页面性能的关键.
  3. 按资产类型/路径过滤.

我总是这样做:

  config.action_controller.asset_host = Proc.new { |source, request|
    "http#{request.ssl? ? 's' : ''}://cdn#{(source.hash % 3)}." << request.domain # cdn0-3.domain.com
  }
Run Code Online (Sandbox Code Playgroud)

或者,如果您有多个资产/ cdn主机,您可以决定选择从哪个主机提供什么类型的资产:

config.action_controller.asset_host = Proc.new { |source, request|
  case source
  when /^\/images/
    "http#{request.ssl? ? 's' : ''}://cdn#{(source.hash % 2)}." << request.domain # cdn0-1.domain.com
  when /^\/javascripts/, /^\/stylesheets/
    "http#{request.ssl? ? 's' : ''}://cdn#{(source.hash % 2) + 2}." << request.domain # cdn2-3.domain.com
  else
    "http#{request.ssl? ? 's' : ''}://cdn4." << request.domain # cdn4.domain.com
  end
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!