本文討論的是瀏覽器對靜態(tài)文件的緩存,,由于通常一個web站點占用最大帶寬的通常是靜態(tài)信息,,例如js,css,,img,。因此了解瀏覽器對靜態(tài)資源的緩存情況是優(yōu)化站點提高訪問速度的關(guān)鍵,其實也是最簡單有效的,。 以下基于3個問題來討論 :
第一個問題: 目前來說通常一個Web網(wǎng)站最大的流量來源于靜態(tài)圖片文件,,使用緩存后可以減少同一客戶端對同一靜態(tài)資源的重復(fù)下載。 首先要說的是緩存并不是說瀏覽器緩存后的信息再次訪問瀏覽器就不會和服務(wù)端產(chǎn)生通信(它需要和服務(wù)端確認(rèn)一下它緩存的東西是不是最新的,,如果是則使用不是的話重新下載),,因此瀏覽器緩存后并不會將少與服務(wù)器的交互次數(shù),也就是說并不能使瀏覽器與服務(wù)端交互次數(shù)降低,但是會降低與服務(wù)端的連接時長,,變相地減少了服務(wù)端的并發(fā),。 因此瀏覽器緩存對于服務(wù)端來說節(jié)省了帶寬,對于客戶端來說減少了重復(fù)下載同一資源的次數(shù),,也就加快了訪問速度,。 第二個問題: 解釋第一個問題時提到瀏覽器緩存某一信息后再次訪問時需要基于某一標(biāo)識來確認(rèn)一下它緩存的東西是否是最新的。這個標(biāo)識有兩種:
當(dāng)瀏覽器請求一個靜態(tài)資源,,服務(wù)端返回該資源時會在返回的Http頭部加入一條Last_modified的信息,,該信息代表該資源最后一次修改的時間。瀏覽器再次請求該資源時會在http請求頭部加入if-modified-since的信息,,該信息為瀏覽器緩存的內(nèi)容的最后修改時間,。(以上說法基于服務(wù)端開啟Last-modified的功能,并且開啟響應(yīng)if-modified-since的功能,。)
功能類似last_modified,,e-tag是對于一個資源的標(biāo)識。瀏覽器通過if-none-match來向服務(wù)端咨詢資源是否為最新的,。E-tag與Last_modified不同之處在于如果存在周期性更改但文件內(nèi)容不會變更的情況下使瀏覽器能夠成功緩存,。(不過暫時我沒有接觸過這種情況) 綜上,服務(wù)端只有在提供了確認(rèn)某一資源是否為最新的標(biāo)識,,并且能夠響應(yīng)瀏覽器的詢問才能夠緩存,。 第三個問題: 瀏覽器的種類及版本繁多,對于緩存的機制設(shè)置也不一樣,。 對于last_modified作為標(biāo)識在解釋第二個問題時我默認(rèn)瀏覽器總是對于訪問過的內(nèi)容進(jìn)行緩存,,而實際上瀏覽器會根據(jù)Last_modified來計算一個過期時間,在這個時間內(nèi)瀏覽器才會發(fā)送if-modified-since,,計算方法各瀏覽器并不一樣,。對于這些機制很難全部把握,并且在實際生成環(huán)境中我們更希望能夠控制這個時間,,這個也是在用Yslow做網(wǎng)站分析時提示盡量這么處理,。 服務(wù)端控制的方式有在httpd頭部加入expires或cache_control來控制。expires指出了該文件的過期時間,,cache_control用max-age指令指定該資源被緩存多久 例如服務(wù)端用nginx來做web服務(wù)器,,希望控制緩存css文件30天。
Nginx的expires會在響應(yīng)http頭部同時加上expires和計算出的cache_control,。 對于E-tag來說本身就是服務(wù)端控制的,。 |
|