在“static”子域上提供资源

10
我该如何配置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

你能告诉我们为什么你想做这样的事情吗? - carpamon
我想使用不同的机器来提供静态文件。 - Oguz Bilgic
2
有很多好的理由去做这件事,这是一种常见的模式。 - odigity
2个回答

18

你了解 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
太好了,原来不只有我在尝试做那件事。 - Oguz Bilgic
不,这通常是在大型Web应用程序中执行的操作。 - phoet

2
您也可以尝试使用rack-cors gem来实现跨域资源共享。这个gem在我的Rails 4应用程序中非常有用,当我开始使用子域名时,我的字体awesome图标无法呈现。这篇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

你在生产环境中是如何处理的?我的意思是,你是否也配置了Nginx或Apache。我认为当资源通过Rails提供服务时,这很有效,但当它被编译后,我们将不得不为此配置Nginx。 - Ziyan Junaideen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接