Rails页面缓存,其中不同的域指向同一个应用程序

时间:2013-01-16 21:12:41

标签: ruby-on-rails caching

我有一个相同的Rails应用程序,其中包含许多域名和轻微的UI差异。每个域可能有不同的语言环境(en,es,fr等)。

我使用caches_page来缓存users控制器的所有对象。我尝试了this solution进行了一些小修改,以便使用域和区域设置而不是子域。

  def self.page_cache_path(path,extension)  
    MyApp::Application.config.action_controller.page_cache_directory + '/cache' + @root_site.to_s + "/" + path + extension
  end

  def cache_page(content = nil, options = nil, gzip = Zlib::BEST_COMPRESSION)
    path = [@root_site, I18n.locale].join("/") # nil would add slash to 2 ends
    path << case options
    when Hash
      url_for(options.merge(:only_path => true, :skip_relative_url_root => true, :format => params[:format]))
    when String
      options
    else
      if request.path.empty? || request.path == '/'
        '/index'
      else
        request.path
      end
    end
    super(content, path, gzip)
  end

此代码似乎正在编写缓存文件,将域名作为第一个文件夹:

Write page /Users/user/Sites/myapp/public/cache/domain1.com/en/users/john.html (1.7ms)
Completed 200 OK 

我看到的问题是,当我访问任何缓存页面时,它没有检索缓存:

Started GET "/users/john" for 127.0.0.1 at 2013-01-16 19:04:18 -0200
Processing by UsersController#show as HTML
...
Write page /Users/user/Sites/myapp/public/cache/domain1.com/en/users/john.html (1.7ms)
Completed 200 OK 

在我的users控件上我只有这个

caches_page :show

任何人都知道什么阻止从缓存文件中读取以及如何解决它?

1 个答案:

答案 0 :(得分:2)

如果您希望Rails按主机名缓存+按主机名提供正确的缓存,则应使用caches_action :show代替。缓存将存储在Rails.cache中,并由Rails自己的机制提供服务。

  

动作缓存在内部使用片段缓存,并使用around过滤器来完成工作。片段缓存根据请求的主机和路径命名。在http://david.example.com/lists/show/1访问的页面将生成名为david.example.com/lists/show/1的片段。   http://api.rubyonrails.org/classes/ActionController/Caching/Actions.html

但是,如果要在提供缓存内容时保留页面缓存并完全避免使用Rails,则应配置 Web服务器以查找自定义中的静态文件路径,通过组合主机名。

e.g。引用page_cache_fu nginx conf的例子

if (-f $document_root/cache/$host/$uri/index.html) {
  rewrite (.*) /cache/$host/$1/index.html break;
}

if (-f $document_root/cache/$host/$uri.html) {
  rewrite (.*) /cache/$host/$1.html break;
}

我没有测试过上述内容,但这就是主意。大多数网络服务器都应该可以实现相同的目标