在“静态”子域上提供资产

时间:2012-01-26 11:51:49

标签: ruby-on-rails assets

如何配置rails以在不同子域上提供资源?我基本上希望视图/资产助手为所有静态文件使用子域,例如;

  • 代替example.com/application.css - > static.example.com/application.css
  • 而不是example.com/application.js - > static.example.com/application.js
  • 而不是example.com/logo.jpg - > static.example.com/logo.jpg

2 个答案:

答案 0 :(得分:15)

你知道asset_host选项吗?

# config/environments/production.rb
config.action_controller.asset_host = "static.example.com"

也可以做动态名称:

ActionController::Base.asset_host = Proc.new { |source|
  "http://assets#{Digest::MD5.hexdigest(source).to_i(16) % 2 + 1}.example.com"
}

http://api.rubyonrails.org/classes/ActionView/Helpers/AssetTagHelper.html

答案 1 :(得分:2)

您还可以尝试使用rack-cors gem进行跨源资源共享。 https://github.com/cyu/rack-cors

我在Rails 4应用程序中使用了这个gem,当我开始使用子域时,我的字体很棒的图标无法渲染。这个wiki让我走上了正确的道路:https://github.com/bokmann/font-awesome-rails/wiki/CORS-Cross-Domain-Support

除了修改我的Gemfile之外,我还根据本指南将以下代码放到config/application.rb顶部:https://github.com/cyu/rack-cors/blob/master/examples/rails4/config/application.rb

config.middleware.insert_before 0, "Rack::Cors", :debug => true, :logger => (-> { Rails.logger }) do
  allow do
    origins '*'

    resource '/cors',
      :headers => :any,
      :methods => [:post],
      :max_age => 0

    resource '*',
      :headers => :any,
      :methods => [:get, :post, :delete, :put, :patch, :options, :head],
      :max_age => 0
  end
end