2011-08-14 65 views
1

我想了解Heroku上的HTTP緩存。在閱讀their article之後,我很好奇Cache-Control HTTP頭是如何工作的。緩存控制頭和Heroku動態圖像

在文章中sample application mentioned頭被設置在控制器的行動:

def image 
    @qrimage = QRImage.find_by_md5(params[:md5]) 
    if @qrimage 
     headers['Cache-Control'] = 'public; max-age=2592000' # cache image for a month 
     send_data @qrimage.data, :filename => @qrimage.filename, :disposition => 'inline', :type => "image/png" 
    else 
     render :nothing => true, :status => 404 
    end 
end 

@qrimage.data的代碼是這樣的:

def data 
    qrcode = RQRCode::QRCode.new(self.message, :size => self.version, :level => self.ecc.to_sym) 
    qrcode.to_s 
    end 

所以對我來說,它看起來像圖像被每次在服務器上生成。然後由瀏覽器緩存一個月。所以這裏唯一的節約是當同一個訪問者試圖查看相同的圖像時。

如果不同的訪問者試圖查看相同的圖像,它仍然會生成併發送。如果你問我的話,那不是很有幫助。

我的理解是正確的,還是不會爲每個網站訪問者重新生成相同的圖像?

回答

2

Aspen和Bamboo堆棧上的Heroku應用程序由Varnish(一個 HTTP加速器)控制。 Varnish會根據標準HTTP標頭提供的提示緩存應用程序 的輸出,以描述頁面的緩存能力。這些標頭與瀏覽器 使用的標頭相同,因此正確設置這些標頭可爲您的應用程序在Heroku上:在光油層和用戶的 瀏覽器上提供雙倍提升 速度。

如果你不知道,Varnish是一個非常快速的緩存,它基本上位於你的應用程序和互聯網之間。當頭文件表示可以安全地緩存時,Varnish會這樣做,並且在緩存對象的情況下響應其他請求,而不會觸及您的應用程序。

+0

因此,Varnish爲所有訪問者保留圖像緩存,並且瀏覽器緩存在第一次訪問後爲訪問者保留圖像? – SooDesuNe

+0

是的。清漆沒有會話或特定訪客的概念。它做什麼,它爲每個人做。瀏覽器爲自身緩存,這只是減少了對服務器的請求/加載。 – coreyward

+0

請記住,如果您爲用戶設置了會話Cookie(機架:會話非空白,即使Google Analytics放棄了Cookie),清漆也會忽略這些標頭,並且該請求會觸發應用。 – stef