我有一个相同的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
任何人都知道什么阻止从缓存文件中读取以及如何解决它?
答案 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;
}
我没有测试过上述内容,但这就是主意。大多数网络服务器都应该可以实现相同的目标