增加Expires Header Add an Expires Header【轉(zhuǎn)】
當(dāng)前位置:點(diǎn)晴教程→知識(shí)管理交流
→『 技術(shù)文檔交流 』
原文地址: http://blog.csdn.net/FrankTaylor/archive/2008/12/30/3657335.aspx 在您設(shè)計(jì)網(wǎng)頁(yè)時(shí),快速的響應(yīng)時(shí)間不應(yīng)該是你唯一要考慮的,如果僅僅是這樣,那我們采用法則1,把我們的頁(yè)面設(shè)計(jì)成一個(gè)極端的網(wǎng)頁(yè):沒(méi)有任何圖片,script,樣式表。我們都明白,圖片、script、樣式表這些組件可以增強(qiáng)用戶(hù)體驗(yàn),雖然它們會(huì)給頁(yè)面帶來(lái)較長(zhǎng)的載入時(shí)間。你幸運(yùn)了,在這一章介紹的法則3,我就要向你介紹如何最大限度地利用瀏覽器的緩存來(lái)使這些頁(yè)面組件更高效的為我們的頁(yè)面服務(wù)。 現(xiàn)在的網(wǎng)頁(yè)所包含的組件越來(lái)越豐富,java applet去了,F(xiàn)lash來(lái)了,script也不可缺少,隨著div的大潮,css樣式表也少不了...... 所以用戶(hù)若第一次訪問(wèn)您的網(wǎng)頁(yè),則可能會(huì)產(chǎn)生多個(gè)HTTP請(qǐng)求;但如果您在請(qǐng)求返回中使用Expires頭信息,則可以緩存這些組件,避免在隨后的訪問(wèn)中產(chǎn)生不必要的HTTP請(qǐng)求,Expires頭信息最常用于圖片,其實(shí)它適合應(yīng)用在所有的組件中,如scripts,樣式表和Flash。但大多數(shù)當(dāng)今的熱門(mén)網(wǎng)站目前并沒(méi)有這樣做。在這一章節(jié)中我會(huì)提及如何讓這些網(wǎng)站可以更快。在使用Header頭信息時(shí),也可能會(huì)有一定的額外開(kāi)銷(xiāo),這點(diǎn)會(huì)在 "改變文件名"段落中再詳談. Expires Header 瀏覽器使用緩存來(lái)減少HTTP請(qǐng)求數(shù)和減少HTTP的響應(yīng)數(shù)據(jù)量,以達(dá)到更快的加載頁(yè)面。web服務(wù)器通過(guò)Expries header來(lái)告訴web客戶(hù)端(John:主要是瀏覽器)當(dāng)前返回的組件在我指定的時(shí)間以前都是可用的,你(瀏覽器)可以留著下次備用(John:有點(diǎn)像我們?cè)诔匈I(mǎi)牛奶時(shí),隨包裝袋上返回的過(guò)期日期)。Expries header 在HTTP規(guī)范中描述為 "the date/time after which the response is considered stale.",它附帶在HTTP的響應(yīng)中返回給客戶(hù)端。 如上圖,這是一個(gè)典型的expries header ,它告訴瀏覽器,直到2010年4月15日這個(gè)請(qǐng)示的返回都不會(huì)變化。如果這個(gè)頭信息是隨著一個(gè)圖片返回的,那瀏覽器就會(huì)緩存這個(gè)圖片,以為其后的頁(yè)面瀏覽直接使用,以減少一個(gè)HTTP請(qǐng)示。 Max-Age and mod_expires 在我解釋緩存是如何更好的提升性能之前,有必要介紹一下與Expries header相關(guān)的幾個(gè)頭信息。Cache-Control header是在HTTP/1.1中被引入以彌補(bǔ)Expries header的不足。因?yàn)镋xpries header使用的是一個(gè)具體的日期,它就要求服務(wù)器與客戶(hù)端之間要有嚴(yán)格的時(shí)鐘檢查,并且當(dāng)過(guò)期日期到來(lái)之后,服務(wù)器端還必須配置一個(gè)新日期。 相反,Cache-Control 使用max-age來(lái)指定一個(gè)時(shí)間段來(lái)標(biāo)識(shí)一個(gè)組件能使用多長(zhǎng)時(shí)間。這個(gè)max-age是以秒為單位來(lái)描述的(John:有點(diǎn)保質(zhì)期的概念)。如果在這個(gè)保質(zhì)期內(nèi),這個(gè)組件再被請(qǐng)求,瀏覽器就直接使用緩存里的就行了。下面就是一個(gè)返回10年保質(zhì)期的頭信息。 使用Cache-Control雖然彌補(bǔ)了Expires的不足,但我們?nèi)匀贿€是得使用 Expires header以兼容那些不支持HTTP/1.1的瀏覽器(盡管這些流量可能還不到1%)。所以我們一般同時(shí)使用Expires和Cache- Control max-age,按HTTP規(guī)范這時(shí)會(huì)以max-age的時(shí)間為優(yōu)先考慮,所以我們還是避免不了服務(wù)器與客戶(hù)端之間的時(shí)鐘檢查和服務(wù)器端的新日期配置。 幸運(yùn)的是我們有Apache的 mod_expires模塊,能讓我們像設(shè)置max-age那樣來(lái)配置Expires header,它使用ExpiresDefault來(lái)設(shè)置一個(gè)時(shí)間段,如下,為圖片,scripts和樣式表設(shè)置10年的有效期: <FilesMatch "\.(gif|jpg|js|css)$"> ExpiresDefault "access plus 10 years" </FilesMatch> 這個(gè)時(shí)間可以是年,月,周,天,小時(shí),分鐘甚至是秒。使用了這個(gè)模塊,所有的響應(yīng)返回中就會(huì)同時(shí)帶著 Expires header 和 Cache-Control max-age 頭信息: 其中Expires header所攜帶的過(guò)期時(shí)間具體是多少,則依賴(lài)于每個(gè)客戶(hù)端什么時(shí)間發(fā)出的請(qǐng)求,在上面的例子中,始終是10年。這樣就避免了我們每次在到期后都要重新設(shè)置服務(wù)器,mod_expires會(huì)搞定一切。 圖3-1是對(duì)10大網(wǎng)站使用這些headr的一個(gè)調(diào)查。有7家使用了這些header,其中有5家同時(shí)使用了 Expires 和 Cache-Control max-age(John:推薦)。各有2家分別只使用 Expires 或Cache-Control max-age。很遺憾有3家什么也沒(méi)使用。 Empty Cache vs. Primed Cache 使用Expires header只會(huì)影響已經(jīng)訪問(wèn)過(guò)的頁(yè)面和組件,當(dāng)用戶(hù)第一次訪問(wèn)您的頁(yè)面時(shí)無(wú)法避免的會(huì)有比較多的HTTP請(qǐng)求數(shù),因?yàn)檫@時(shí)瀏覽器的緩存里是空的。所以如果您的網(wǎng)站能吸引用戶(hù)訪問(wèn)更多的頁(yè)面,并經(jīng)常在此停留,我們所做的緩存工作才有效果。 不僅僅是圖片 More Than Just Images 一般Expires header常用于圖片,其實(shí)這并不是最佳實(shí)踐。Expires header應(yīng)該應(yīng)用于所有那些不經(jīng)常變動(dòng)的組件,script,樣式表或Flash組件。 在理想情況下,所有組件都在一個(gè)頁(yè)面內(nèi),并且都有一個(gè)未過(guò)期的Expries header,而隨后瀏覽的頁(yè)面只一個(gè)對(duì)HTML源文件的HTTP請(qǐng)求,其余的組件都在瀏覽器的緩存中直接提供,這時(shí)的響應(yīng)時(shí)間會(huì)提高50%甚至更多。 我調(diào)查了美國(guó)的10大網(wǎng)站,并記錄了其中有多少圖片,script和樣式表是設(shè)置了至少30天有效期的Expires 或是 Cache-Control max-age header,如表3-2所示,情況并不是太好,圖中所列的是被緩存至少30天的組件數(shù),分母是該網(wǎng)站上的所有的該類(lèi)型組件數(shù),分子是被加了過(guò)期 header的組件數(shù)。 • 有5家網(wǎng)站把大多數(shù)圖片的緩存有效期設(shè)為30天以上. • 有4家網(wǎng)站把大多數(shù)樣式表的緩存有效期設(shè)為30天以上. • 有2家網(wǎng)站把大多數(shù)script的緩存有效期設(shè)為30天以上. 從上圖的百分比中俺發(fā)現(xiàn)有74.7%的組件沒(méi)有被緩存或是有效期低于30天。一種解釋就是這些組件因?yàn)闃I(yè)務(wù)關(guān)系而不應(yīng)該被緩存,如新聞網(wǎng)站 CNN.com就是個(gè)例子,138張圖片中沒(méi)有一張被緩存,這是因?yàn)楹芏嘈侣務(wù)掌徊粩喔露槐鼐彺嬖谟脩?hù)端,所以這時(shí)更適合用Last- Modified heade,來(lái)通過(guò)組件的最后修改時(shí)間判斷是否要讀取新數(shù)據(jù)。 表3-2的最后一項(xiàng),顯示了未被緩存的組件的最后修改時(shí)間的中分線,就CNN.com來(lái)說(shuō)有一半的未緩存組件的最后修改時(shí)間是在227天前了,很顯然這些組件是應(yīng)該被緩存的。 這種情況也曾發(fā)生在Yahoo!,在過(guò)去,Yahoo!并沒(méi)有緩存script,樣式表和一些圖片,是因?yàn)槲覀冋J(rèn)為這樣是經(jīng)常變化的,用戶(hù)有必要每次訪問(wèn)時(shí)都去請(qǐng)求一次以獲取最新的??蓡?wèn)題是,在實(shí)際應(yīng)用中,這些組件并不是我們想像中的那樣要經(jīng)常變化更新,我意識(shí)到應(yīng)該把它們緩存來(lái)提升用戶(hù)體驗(yàn)。后來(lái),Yahoo!選擇了去緩存它們,哪怕會(huì)帶來(lái)一些額外的開(kāi)發(fā)花銷(xiāo),這就是我馬上要談到的Revving Filenames。 改變文件名 Revving Filenames 如果我們已經(jīng)為組件設(shè)置了緩存,可當(dāng)這些組件又需要更新時(shí),用戶(hù)如何才到得到最新的組件呢?由我們前面介紹的Expires 或是 Cache-Control max-age header 都會(huì)讓瀏覽器不檢查任何改變,直接從本地硬盤(pán)中讀取緩存,除非是過(guò)了有效期。所以我們能做的,就是在HTML頁(yè)面中改變這個(gè)組件的文件名。在Mark Nottingham的文章"Caching Tutorial for Web Authors and Webmasters"談到這個(gè)問(wèn)題: 優(yōu)選的方案還是改變它們的鏈接;只有這樣,用戶(hù)才能從服務(wù)器上獲取更新。(The most effective solution is to change any links to them; that way, completely new representations will be loaded fresh from the origin server.) 說(shuō)白了,還是要改變文件名。在已有的頁(yè)面中改變文件名可能是件頭疼的煩事,但是,不得不這樣,如果您使用的是PHP,Perl等動(dòng)態(tài)的頁(yè)面,不妨利用一個(gè)變量為所有的組件命名,這樣換起文件名來(lái)比較省事。在Yahoo!,我們是在組件名后面跟上版本號(hào)(如,yahoo_2.0.6.js),把這個(gè)版本號(hào)做為一個(gè)變量寫(xiě)在程序中,真的很省事。 舉例 Examples 下面的兩個(gè)鏈接,包包含有相同的組件:6個(gè)圖片,3個(gè)script和1個(gè)樣式表。第一個(gè)鏈接沒(méi)有任何Expires header,而第二個(gè)鏈接,全有。 No Expires http://stevesouders.com/hpws/expiresoff.php Far Future Expires http://stevesouders.com/hpws/expireson.php 我在900Kbps的DSL下測(cè)試,加了過(guò)期頭設(shè)置的鏈接頁(yè)面訪問(wèn)時(shí)間會(huì)減少600~260毫秒,能提升57%,如果頁(yè)面的組件再多一點(diǎn),這個(gè)百分比還會(huì)更高。 要說(shuō)明一點(diǎn),并不是說(shuō)沒(méi)有加過(guò)期頭的組件就不會(huì)被瀏覽器緩存,它們也會(huì)被緩存,還記得我在Chapter B 中介紹的有條件的GET請(qǐng)求嗎,只不過(guò),會(huì)多一個(gè)HTTP請(qǐng)求到服務(wù)器端以詢(xún)問(wèn)這個(gè)組件是否有效,如果這個(gè)組件的最后修改時(shí)間和以前一下,則直接使用緩存中的版本,HTTP返回中將不帶這個(gè)組件的具體數(shù)據(jù)了。 為您頁(yè)面上的組件貼上保質(zhì)期吧,再加有有條件的GET請(qǐng)求,帶來(lái)的會(huì)是減少近一半的HTTP請(qǐng)求數(shù)還有不必要的數(shù)據(jù)傳輸。 該文章在 2010/12/15 0:08:15 編輯過(guò) |
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)... |