Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 什么会导致Rails页面缓存停止工作?_Ruby On Rails_Ruby_.htaccess_Caching - Fatal编程技术网

Ruby on rails 什么会导致Rails页面缓存停止工作?

Ruby on rails 什么会导致Rails页面缓存停止工作?,ruby-on-rails,ruby,.htaccess,caching,Ruby On Rails,Ruby,.htaccess,Caching,我有一个Rails应用程序,它已经停止了缓存,我不确定是哪个版本阻止了它的工作 我的印象是,页面缓存在正常工作时,如果找到缓存的文件,甚至不应该命中Rails。然而,当加载我的页面并监视production.log时,它同时影响了Rails和DB 我设置了一个清理程序,可以在:create、:update和:destroy上清除缓存。它可以正常工作,因为只要发生其中一个事件,/public/cache/index.html文件就会更新。一开始我认为这可能是因为我使用了OutputCompress

我有一个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
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,但AsmalolRange不支持,而DreamHost支持(在他们将我的价格提高三倍之前)

无论如何,有人能解释一下Rails为什么忽略缓存的index.html吗?我假设它是.htaccess中的某个东西,因为如果它工作正常,它永远不会接触Rails

编辑:缓存问题原来是重写规则的第一个斜杠。直到我将它们都更改为“cache/index.html”,它才找到缓存的文件,现在缓存工作得非常好

但是,现在我必须删除OutputCompression调用,因为它返回的是gzip版本的文件,其内容类型设置为“text/html”。你知道如何让它发送该文件的正确内容类型吗?它是整个应用程序中唯一缓存的一个

再次编辑:将.htaccess更改为该选项无助于解决gzip问题:

RewriteRule ^/$ cache/index.html [QSA,T=application/x-gzip]
RewriteRule ^$ cache/index.html [QSA,T=application/x-gzip]

它仍然显示为zip文件的文本表示形式(即乱码),除非禁用压缩。不过,缓存工作得很好。

我会检查一下您的ETag配置。如果您使用多个web服务器,并且未将其配置为独立于为文件提供服务的计算机,则通常会阻止正确缓存文件。

为什么要使用OutputCompression插件?Apache可以为您做到这一点。退房

以下是我使用的规则:

# Deflate
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/x-java
script
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
这将压缩应用程序的所有文本输出,静态和动态


只是一个猜测,但我想这也会更快,因为这是一个用C编写的Apache模块。

最终解决了问题,我的站点在停机10周后再次上线。一旦我让它加载缓存文件,我发现另一个问题是OutputCompression插件将文件压缩为.gz文件,但Rails将其保存为.html,Apache将其作为text/html,这导致了混乱

解决我的问题的修复程序:

在.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]
AddEncoding x-gzip .gz
AddType text/html .gz

RewriteRule ^/$ cache/index.gz [QSA]
RewriteRule ^$ cache/index.gz [QSA]
在config/environments.rb中:

ActionController::Base.page_cache_extension = ".gz"
Ruby代码将“caches”指令另存为“cache/index.gz”而不是“cache/index.html”。AddEncoding告诉它不要将其作为html,但它本身只会显示页面源代码,因为它默认为“text/plain”的内容类型。AddType更改了一些内容,以便将.gz文件用作“text/html”,从而实现正确的显示

这可能不适用于所有人,但由于我在网站上的任何地方都不提供.gz文件,而且首页是唯一一个缓存的,所以这对我来说非常适合


谢谢大家的帮助。

你看到应该创建的index.html文件了吗?@fd:是的,如第三段所述,它是在/public/cache/index.html中正确创建的。如果发生创建、更新或销毁事件,该文件将被擦除并替换为新生成的文件,该文件同样包含正确的内容。加载页面时,单击指向相同URL(站点的基础)的链接。htaccess应该使用缓存版本,但它没有。我希望Ctrl+F5可以强制刷新(可能),但这只是两次单击指向主索引页的同一链接。令人费解的是,重写规则看起来很有说服力。所以我默认检查我的假设。是否正确获取.htaccess?mod_rewrite是否已安装并运行?等等,Ofc,我希望答案是肯定的,因为你正以某种方式进入Rails,但我通常会通过挑战我认为我知道的关于一个故障系统的事实来发现一些有趣的东西。它应该只是一个共享主机上的单一web服务器,我听说过ETag,但不知道它们是什么或如何设置它们。有什么建议吗?如果我不在Asmalolange的共享主机上,它已经禁用了mod_deflate和mod_gzip,那肯定会有用的。OutputCompression做同样的事情,使用相同的处理器时间,所以我不知道他们为什么不启用它。不过,谢谢你的建议。如果我能说服他们为我启用mod_deflate,我会用的。哦,糟糕。这将大大减少他们的带宽。新主机?;)你可能想尝试将你的应用程序升级到Heroku的免费级别。即使是他们最低的付费水平也和共享主机的成本差不多。谢谢你的建议。因为我喜欢麻生太郎,所以重新升级了一年,我正在用Django重新编写我的应用程序,这样我就可以重新学习Python(当然也可以学习Django)。你知道有没有免费的托管服务吗?你只需稍加努力,就可以在谷歌应用程序引擎上运行Django。他们的免费水平非常高。