RubyonRails 的 Page Cache 默認(rèn)是將緩存的文件報(bào)存到 Base.page_cache_directory 目錄中(默認(rèn)是 Rails 項(xiàng)目的 public 目錄);并且,在默認(rèn)設(shè)置下會(huì)冠以 .html 擴(kuò)展名,但這里有一個(gè)特殊的處理:如果你請(qǐng)求的 URL 地址最后部分包含了“.”符號(hào),Rails 就不會(huì)增加這個(gè)緩存擴(kuò)展名,而是直接根據(jù)請(qǐng)求的文件名進(jìn)行保存。比如我的一篇網(wǎng)志中設(shè)置了這個(gè)標(biāo)簽:docs., 這個(gè)時(shí)候,Rails會(huì)將 /tag/docs. 直接緩存為 /public/tag/docs. 文件,而不是我所期望的 /public/tag/docs..html;這個(gè)擴(kuò)展名的差別,致使 Web 服務(wù)器向?yàn)g覽器發(fā)送錯(cuò)誤的 MIME 頭,使用戶在訪問(wèn)被緩存的 /tag/docs. 頁(yè)面時(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 name
end
可以看到,Rails 對(duì)緩存文件的名稱(chēng)進(jìn)行了檢查,如果名稱(chēng)中包含“.”符號(hào),那么不再追加緩存文件擴(kuò)展名(.html)。從某種程度上來(lái)說(shuō),這是一種正確的思路,因?yàn)橛脩粲? 可能就是期望緩存一個(gè)特殊格式的文件,比如 .pdf 文檔或者 .png 圖片等,但對(duì)于我的 Blog 卻是得到了錯(cuò)誤的結(jié)果。
我覺(jué)得,更合理的方式是為 action_controller/caching.rb 增加一個(gè)開(kāi)關(guān),根據(jù)這個(gè)開(kāi)關(guān)來(lái)決定是否檢測(cè)文件名中包含“.”而不再追加擴(kuò)展名,這個(gè)開(kāi)關(guān)應(yīng)該象其他參數(shù)一樣,可以通過(guò)環(huán)境設(shè)置文件進(jìn)行指定。
目前,我是偷懶,直接修改了 action_controller/caching.rb 源代碼,等有時(shí)間再寫(xiě)一個(gè)完善一些的 patch:
def page_cache_file(path)
name = ((path.empty? || path == "/") ? "/index" : URI.unescape(path))
name << page_cache_extension
return name
end
標(biāo)簽:rubyonrails,page cache,extension




