只是想在这里解决我的问题。
需要告知 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;
}
如果有人对上面的代码有任何反馈,我很乐意听到。谢谢!