【发布时间】:2009-08-21 00:10:24
【问题描述】:
我有一个 Rails 应用程序在某处停止缓存,我不确定是哪个版本导致它无法工作。
我的印象是页面缓存在正常工作的情况下,如果找到缓存的文件,它甚至不应该命中 Rails。但是,当加载我的页面并监控 production.log 时,它会同时影响 Rails 和 DB。
我设置了一个清扫器,用于清除 :create、:update 和 :destroy 上的缓存。它工作正常,因为 /public/cache/index.html 文件会在其中一个事件发生时更新。起初我以为可能是因为我使用的是 OutputCompression 插件,但删除它有相同的结果,所以我把它放回去了。 index.html 在那里,但是 .htaccess 和 Rails 忽略它并重建整个页面,包括重写缓存的 index.html。
以下是代码的相关部分(除非我遗漏了什么):
控制器:
class SecretsController < ApplicationController
caches_page :index
cache_sweeper :secret_sweeper, :only => [:create, :update, :destroy]
# snipped
end
.htaccess:
RewriteEngine On
# Rewrite index to check for cached
RewriteRule ^/$ /cache/index.html [QSA]
RewriteRule ^$ /cache/index.html [QSA]
RewriteRule ^([^.]+)$ $1.html [QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
Firebug 响应标头
Date: Tue, 02 Jun 2009 18:50:36 GMT
Server: Apache/1.3.41 (Unix) mod_fastcgi/2.4.2 PHP/5.2.9 mod_log_bytes/1.2 mod_bwlimited/1.4 mod_auth_passthrough/1.8 FrontPage/5.0.2.2635 mod_ssl/2.8.31 OpenSSL/0.9.8b
Vary: Accept-Encoding
X-Runtime: 0.05637
Etag: "4f3497a74141d1e92ae7a1fe4d5dc1d2"
Cache-Control: private, max-age=0, must-revalidate
Content-Encoding: gzip
Content-Length: 22356
Connection: close
Content-Type: text/html; charset=utf-8
default-style: tms
我希望能够使用 mod_gzip,但 ASmallOrange 不支持它,而 DreamHost 支持(在他们将我的价格翻了三倍之前)。
无论如何,谁能解释为什么 Rails 忽略了缓存的 index.html?我假设它是 .htaccess 中的东西,因为如果它工作正常,它不应该接触 Rails。
编辑:缓存问题原来是 RewriteRules 上的第一个斜线。在我将它们都更改为“cache/index.html”之前,它没有找到缓存文件,现在缓存工作完美。
但是,现在我必须删除 OutputCompression 调用,因为它返回的是 Content-Type 设置为“text/html”的文件的 gzip 压缩版本。知道如何让它为该文件发送正确的内容类型吗?它是整个应用程序中唯一缓存的一个。
再次编辑:将 .htaccess 更改为此对 gzip 问题没有帮助:
RewriteRule ^/$ cache/index.html [QSA,T=application/x-gzip]
RewriteRule ^$ cache/index.html [QSA,T=application/x-gzip]
除非禁用压缩,否则它仍会显示为 zip 文件的文本表示形式(即乱码)。不过,缓存效果很好。
【问题讨论】:
-
看到应该创建的index.html文件了吗?
-
@fd:是的,如第三段所述,它在 /public/cache/index.html 中正确创建。如果创建、更新或销毁事件发生,该文件将被擦除并替换为新生成的文件,再次包含正确的内容。当我加载页面,然后单击指向相同 URL(站点的基础)的链接时,.htaccess 应该使用缓存版本,但事实并非如此。我希望 Ctrl+F5 强制刷新(也许),但这只是两次单击指向主索引页面的相同链接。
-
相当令人费解,RewriteRules 看起来很有说服力。所以我会默认检查我的假设。 .htaccess 是否被正确提取? mod_rewrite 是否已安装并正常工作?等等。Ofc,我希望答案是肯定的,因为你以某种方式进入 Rails,但我通常会通过挑战我认为我知道的关于故障系统的真实情况来发现一些有趣的事情。
标签: ruby-on-rails ruby .htaccess caching