RubyonRails Page Cache 的扩展名问题

来源:百度文库 编辑:神马文学网 时间:2024/04/29 22:52:22
RubyonRails Page Cache 的扩展名问题
@由DIrk 发表于 2007-01-12 Friday
RubyonRails的 Page Cache 默认是将缓存的文件报存到 Base.page_cache_directory 目录中(默认是 Rails 项目的public 目录);并且,在默认设置下会冠以 .html 扩展名,但这里有一个特殊的处理:如果你请求的 URL 地址最后部分包含了“.”符号,Rails 就不会增加这个缓存扩展名,而是直接根据请求的文件名进行保存。比如我的一篇网志中设置了这个标签:docs.dirk.sh,这个时候,Rails会将 /tag/docs.dirk.sh 直接缓存为 /public/tag/docs.dirk.sh文件,而不是我所期望的 /public/tag/docs.dirk.sh.html;这个扩展名的差别,致使 Web 服务器向浏览器发送错误的 MIME 头,使用户在访问被缓存的 /tag/docs.dirk.sh 页面时,可能直接显示源代码或者提示下载。
研究一下 RoR 的源代码,从 action_controller/caching.rb 文件中找到以下代码:
def page_cache_file(path)name = ((path.empty? || path == "/") ? "/index" : URI.unescape(path))name << page_cache_extension unless (name.split(‘/‘).last || name).include? ‘.‘return nameend
可以看到,Rails对缓存文件的名称进行了检查,如果名称中包含“.”符号,那么不再追加缓存文件扩展名(.html)。从某种程度上来说,这是一种正确的思路,因为用户有可能就是期望缓存一个特殊格式的文件,比如 .pdf 文档或者 .png 图片等,但对于我的 Blog 却是得到了错误的结果。
我觉得,更合理的方式是为 action_controller/caching.rb 增加一个开关,根据这个开关来决定是否检测文件名中包含“.”而不再追加扩展名,这个开关应该象其他参数一样,可以通过环境设置文件进行指定。
目前,我是偷懒,直接修改了 action_controller/caching.rb 源代码,等有时间再写一个完善一些的 patch:
def page_cache_file(path)name = ((path.empty? || path == "/") ? "/index" : URI.unescape(path))name << page_cache_extensionreturn nameend
标签:rubyonrails,page cache,extension