在Rails 3中配置动态assets_host

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

mysite.com – assets.mysite.com mysite.ru – assets.mysite.ru

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

在config / environments / production.rb等。

config.action_controller.asset_host = "http://assets." << request.host 

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

 config.action_controller.asset_host = proc {|path, request| "http://assets." << request.host } 

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

  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 } 

或者,如果您有多个资产/ 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 } 

希望这可以帮助!

你是指子域吗?

 subdomains(tld_length = 1) Returns all the subdomains as an array, so ["dev", "www"] would be returned for “dev.www.rubyonrails.org“. You can specify a different tld_length, such as 2 to catch ["www"] instead of ["www", "rubyonrails"] in “www.rubyonrails.co.uk“.