最近看雅虎黃金34條,學(xué)習(xí)下優(yōu)化網(wǎng)站性能的方法。其中有一條:“為文件頭指定expires或cache-control”,具體來說指對于靜態(tài)內(nèi)容:設(shè)置文件頭過期時間expires的值為“neverexpire”永不過期;而對于動態(tài)內(nèi)容:使用恰當(dāng)?shù)腸ache-control文件頭來幫助瀏覽器進(jìn)行有條件的請求。
這一條可以和雅虎34條的第一條聯(lián)系起來,那就是盡量減少http的請求次數(shù)(雅虎34條很多都是努力去減少http請求為目的的),畢竟如果有太多的資源需要下載需要新的http鏈接疊加起來的耗時是不容忽視的。所以可以利用緩存技術(shù)來對網(wǎng)站的性能加以優(yōu)化,從而避免不必要的http請求。剛好可以順便整理下瀏覽器相關(guān)的緩存技術(shù)和與緩存相關(guān)的http的頭:
1.expires(過期時間):
http頭信息expires(過期時間)屬性是http控制緩存的基本手段,告訴瀏覽器緩存保存的時間。過了這個時間,緩存器就會向源服務(wù)器發(fā)送請求,檢查文檔是否被修改。適用于設(shè)置靜態(tài)圖片文件等等,而且對于控制有規(guī)律改變的網(wǎng)頁也很有用,比如設(shè)置間隔固定的時間去更新等等;如果使用了expires文件頭,當(dāng)頁面內(nèi)容改變時就必須改變內(nèi)容的文件名。比如yahoo經(jīng)常使用這樣的步驟:在內(nèi)容的文件名中加上版本號,如yahoo_2.0.6.js,從而能夠主動進(jìn)行更新。
使用expires:如果你使用的是apache服務(wù)器,可以使用expiresdefault來設(shè)定相對當(dāng)前日期的過期時間,使用mod_expires,在httpd.conf或者.htaccess中加上
代碼如下:
<filesmatch\\.(ico|gif|jpg|html)$>expiresdefaultaccessplus10years</filematch>
2.cache-control
各個消息中的指令含義如下:
1.public指示響應(yīng)可被任何緩存區(qū)緩存;
2.private指示對于單個用戶的整個或部分響應(yīng)消息,不能被共享緩存處理。這允許服務(wù)器僅僅描述當(dāng)用戶的部分響應(yīng)消息,此響應(yīng)消息對于其他用戶的請求無效。
3.no-cache指示請求或響應(yīng)消息不能緩存;
4.no-store用于防止重要的信息被無意的發(fā)布。在請求消息中發(fā)送將使得請求和響應(yīng)消息都不使用緩存;
5.max-age指示客戶機(jī)可以接收生存期不大于指定時間(以秒為單位)的響應(yīng)。
6.min-fresh指示客戶機(jī)可以接收響應(yīng)時間小于當(dāng)前時間加上指定時間的響應(yīng)。
7.max-stale指示客戶機(jī)可以接收超出超時期間的響應(yīng)消息。如果指定max-stale消息的值,那么客戶機(jī)可以接收超出超時期指定值之內(nèi)的響應(yīng)消息;
舉例:
一般說來這種靜態(tài)文件永遠(yuǎn)不應(yīng)該過期,如果真的要給這個cache加上一個期限,那我希望是——一萬年
即:“cache-control:max-age=315360000000”
3.last-modified/if-modified-since
一問一答的模式,這邊問你更新了沒有,那邊回答,很容易理解;
4.配置etag
entitytags(etags)(實體標(biāo)簽)是web服務(wù)器和瀏覽器用于判斷瀏覽器緩存中的內(nèi)容和服務(wù)器中的原始內(nèi)容是否匹配的一種機(jī)制(“實體”就是所說的“內(nèi)容”,包括圖片、腳本、樣式表等)。增加etag為實體的驗證提供了一個比使用“l(fā)ast-modifieddate(上次編輯時間)”更加靈活的機(jī)制。etag是一個識別內(nèi)容版本號的唯一字符串。唯一的格式限制就是它必須包含在雙引號內(nèi)。原始服務(wù)器通過含有etag文件頭的響應(yīng)指定頁面內(nèi)容的etag。例如:
http/1.1200ok
last-modified:tue,12dec200603:03:59gmt
etag:“10c24bc-4ab-457e1c1f”
content-length:12195
稍后,如果瀏覽器要驗證一個文件,它會使用if-none-match文件頭來把etag傳回給原始服務(wù)器。在這個例子中,如果etag匹配,就會返回一個304狀態(tài)碼,這就節(jié)省了12195字節(jié)的響應(yīng)。
get/i/yahoo.gifhttp/1.1
host:us.yimg.com
if-modified-since:tue,12dec200603:03:59gmt
if-none-match:“10c24bc-4ab-457e1c1f”
http/1.1304notmodified
關(guān)于以上幾種緩存機(jī)制的優(yōu)先級,在網(wǎng)上找到一種說法:
no-cache>expires>last-modified
也就是講,最前面的最重要,前面的生效后,后面的基本就失效了