2

我有一个设置为缓存 json 调用的应用程序。我尝试了各种代码语法,它似乎只有在我有以下情况时才能正确缓存:

    caches_page :index, :gzip => true
    cache_sweeper :institutes_sweeper

    respond_to :json, :js

    def index
      @institutes = Institute.select([:id, :name]).all
      render :json => { :institutes => @institutes }
    end

现在,当它被击中时,它会呈现一个 html 文件,并且缓存会按预期工作。Rails 堆栈没有受到影响。

如果我抛出一个格式块并让渲染响应 json,缓存将创建文件;但是,它会在下一次创建另一个文件并忽略已经存在的文件。

apache 是否必须进行不同的配置才能按预期工作?

另外,我想使用 public/cache/ 作为存储缓存的目录。我正确配置了导轨;但是,我想知道如何配置 apache 来提供那些缓存的文件(上面同样的问题发生在文件被创建但没有被提供的地方)。

感谢你的帮助!

4

1 回答 1

2

只是想在这里解决我的问题。

需要告知 Apache 缓存文件所在的位置。它仅存储在公共区域时起作用的原因是因为这就是 apache 默认的行为方式。将以下配置添加到您定义虚拟主机的任何位置

RailsAllowModRewrite On
RewriteEngine On

RewriteCond %{THE_REQUEST} ^(GET|HEAD)
RewriteCond %{REQUEST_URI} ^/([^.]+)$
RewriteCond %{DOCUMENT_ROOT}/cache/%1.json -f
RewriteRule ^/[^.]+$ /cache/%1.json [QSA,L]

RewriteCond %{THE_REQUEST} ^(GET|HEAD)
RewriteCond %{DOCUMENT_ROOT}/cache/index.json -f
RewriteRule ^/$ /cache/index.json [QSA,L]

RewriteCond %{THE_REQUEST} ^(GET|HEAD)
RewriteCond %{REQUEST_URI} ^/([^.]+)$
RewriteCond %{DOCUMENT_ROOT}/cache/%1.html -f
RewriteRule ^/[^.]+$ /cache/%1.html [QSA,L]

RewriteCond %{THE_REQUEST} ^(GET|HEAD)
RewriteCond %{DOCUMENT_ROOT}/cache/index.html -f
RewriteRule ^/$ /cache/index.html [QSA,L]

现在,解决 json 渲染 html 的问题,我发现这是因为我在应用程序控制器中的调用在实际函数执行之前执行。如果我在这些函数上使用 skip_before_filter,我会更近一步。

我还发现将响应包装在格式块中会更好。

respond_to do |format| 
  format.json { json: { institutes: @institutes } }
end

这将导致 json 被缓存,并且服务器配置将导致它被正确提供。

我相信对于那些使用 Nginx 的人来说,应该使用以下配置(虽然不是 100% 肯定)

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

    if (-f $request_filename/index.json) {
      rewrite (.*) $1/cache/index.json break;
    }

如果有人对上面的代码有任何反馈,我很乐意听到。谢谢!

于 2012-10-17T20:42:58.630 回答