2

有没有人成功实现了带有子域的 Rails 页面缓存?

现在,相同的文件正在子域之间提供服务,因为 rails 无法识别子域已更改的事实。

我希望我的页面缓存看起来像这样:

/public/cache/subdomain1/index.html
/public/cache/subdomain1/page2.html
/public/cache/subdomain2/index.html
/public/cache/subdomain2/page2.html

我正在使用 nginx 来提供这些页面,因此需要更改其配置文件以在缓存这些文件后找到这些文件,这不是问题。目前对我来说,症结在于轨道末端。

4

2 回答 2

1

我用了这个人的帖子(做了一些修改)

class ApplicationController < ActionController::Base

  # Cache pages with the subdomain
  def cache_page(content = nil, options = nil, gzip = Zlib::BEST_COMPRESSION)
    path = [nil, request.subdomains, nil].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

然后只需使用通常的 caches_page 类方法。

这样做的缺点是,我还需要破解 expire_page (帖子中没有提到)。如果存在,Rails 也不会使用现有的页面缓存,因为它不会在默认路径中找到它。

于 2012-07-03T04:20:08.673 回答
1

您需要根据正在使用的子域更新缓存位置。

您可以添加一个before_filter来执行此操作。

一个例子是:

class ApplicationController < ActionController::Base
  before_filter :update_cache_location

  def update_cache_location
    if current_subdomain.present?
      ActionController::Base.page_cache_directory = "#{Rails.public_path}/cache/#{current_subdomain.directory_name}"
    end
  end
end
于 2012-05-23T08:41:01.220 回答