緩存友好的網(wǎng)頁

          緩存友好的網(wǎng)頁

          by Jennifer Vesperman ?03/07/2002 ?原文地址:http://www.linuxdevcenter.com/pub/a/linux/2002/02/28/cachefriendly.html

          翻譯:ShiningRay @ Nirvana Studio

          現(xiàn)在我們有很多HTTP緩存。他們存放你的頁面多久呢?他們應(yīng)該存放多久呢?RFC 2616(HTTP/1.1)指出了緩存必須遵循Expires和Cache-Control頭——那么你的頁面是否都有呢?

          “在HTTP/1.1種的緩存的目的是為了在很多情況下消除發(fā)送請求的需要,同時在其他一些情況下消除發(fā)送完整的響應(yīng)的需要。” RFC 2616

          緩存友好頁面的優(yōu)點(diǎn)

          “當(dāng)緩存可以完全避免對原始服務(wù)器發(fā)送請求時,HTTP緩存的工作是最佳的。避免請求的主要機(jī)制是,針對原始服務(wù)器提供未來的一個確切的失效時間,表示一個響應(yīng) 可以 被用來滿足后續(xù)的請求。換句話說,一個緩存可以返回一個新的響應(yīng)而不必先聯(lián)系服務(wù)器?!?/span> RFC 2616

          RFC寫的時候是期望網(wǎng)頁要包含失效期頭的。如果謹(jǐn)慎地選擇頭中的失效時間,緩存可以不失去任何意義來提供存儲了的頁面。?

          當(dāng)原始服務(wù)器不提供失效頭時,緩存根據(jù)諸如“Last-Modified”之類的頭來推斷,猜測出一個合適的失效時間。與由了解頁面內(nèi)容以及更改頻率的人設(shè)置的失效日期相比,推斷的方法顯然效率較低。?

          “由于推斷的失效時間也許會降低語義透明度,應(yīng)該被謹(jǐn)慎使用,同時我們鼓勵原始服務(wù)器盡可能提供確切的失效時間?!?/span> RFC 2616

          關(guān)于緩存的注意事項(xiàng)

          HTTP/1.1標(biāo)準(zhǔn)(第13節(jié))關(guān)于緩存有一個強(qiáng)制的要求:它要求他們提供語義的透明——返回一個緩存了的響應(yīng)必須提供本來從原始服務(wù)器上獲取的同樣的數(shù)據(jù);同時它提倡讀取原始服務(wù)器和客戶端所提供的新鮮度要求。

          緩存必須傳遞由上游緩存或者是原始服務(wù)器提供的警告,而且如果提供了一個陳舊的響應(yīng),他們也必須加入警告。一個緩存可以在特定的情況下提供一個陳舊的響應(yīng),大部分情況下是如果緩存無法連接到原始服務(wù)器同時客戶端聲明它可以接受一個陳舊的響應(yīng)。?

          如果一個緩存收到了針對一個陳舊頁面的請求,它發(fā)送一個驗(yàn)證請求詢問原始服務(wù)器頁面是否已經(jīng)更改。最常見的驗(yàn)證工具便是最后的更新時間。如果在一秒鐘內(nèi)存儲了兩次更改,Last-Modified將會不正確。因此,HTTP/1.1利用Entity Tag頭提供了更加嚴(yán)格的驗(yàn)證。?

          最簡便的協(xié)助緩存的方法是保持你的HTTP服務(wù)器上的時間精確且總是發(fā)送Date和Last-Modified頭。?

          另外,要成為一個真正的緩存友好的站長,還要在你的頁面中加入緩存頭。?

          可用的緩存頭

          Expires頭是最快捷最方便的解決方案。這個頭聲明了頁面被認(rèn)為不再可被緩存的時間,在這之后,任何保存了這個頁面副本的緩存都應(yīng)該聯(lián)系原始服務(wù)器。語法是:?

          Expires: <date in RFC 1123 format>

          例如:?

          Expires: Sun, 10 Feb 2002 16:00:00 GMT

          若要標(biāo)記一個響應(yīng)為已經(jīng)“已經(jīng)過期”或者“不可緩存”,頭則應(yīng)該設(shè)置為發(fā)送響應(yīng)的時間。若要標(biāo)記一個響應(yīng)為“永不過期”,則應(yīng)該將頭設(shè)置為未來的一年。?

          另一個頭是Cache-Control。Cache-Control包括了這些元素:指明頁面元素最大時限,他應(yīng)該如何被緩存的,他如何被轉(zhuǎn)換到另一個不同的媒介,以及他如何被存放在持久媒介中的。

          本文使用Apache為例,設(shè)置頭并在例子中詳細(xì)討論Cache-Control頭。

          在Apache中設(shè)置緩存頭

          主要的方法:Expires頭

          要使用Expires頭,你需要運(yùn)行在Apache 1.2或者更新的版本上,同時要啟用 mod_expires 模塊。去掉 httpd.conf 文件在“Dynamic Object Support”一節(jié)中的 expires_module 一行上的注釋,然后重新編譯Apache。

          #

          # Dynamic Shared Object (DSO) Support

          #

          ?

          # LoadModule cern_meta_module /usr/lib/apache/1.3/mod_cern_meta.so

          LoadModule expires_module /usr/lib/apache/1.3/mod_expires.so

          (如果你運(yùn)行的是Apache 1.3或更新的版本,同時它已經(jīng)配置為運(yùn)行時加載模塊,你可以編輯 httpd.conf 然后重新啟動Apache而無需重新編譯。)

          mod_expires 基于三條指令來計算Expires頭。這些指令可以應(yīng)用于文檔范圍同時也可以在任何以下范圍內(nèi)使用:“server config”、“virutal host”、“directory”、或者“.htaccess”。

          Expires指令有兩種語法。其中一個有點(diǎn)難以閱讀;它要你計算到失效為止用的秒數(shù)。幸運(yùn)的是,這個模塊同樣可以讀取一個更加人性化的語法。本文將解釋較為可讀的語法。

          要用到的指令是:

          ExpiresActive on|off

          ExpiresDefault "<base> [plus] {<num> ?<type>}*"

          ExpiresByType type/encoding "<base> [plus] {<num> <type>}*"

          base 可以是以下其中之一:

          • access ?

          • now (等同于“access”)

          • modification ?

          num 是一個整數(shù)值,單位是 type

          • years ?

          • months ?

          • weeks ?

          • days ?

          • hours ?

          • minutes ?

          • seconds ?

          如果你準(zhǔn)備對一個服務(wù)器、虛擬主機(jī)或者是目錄使用Expires指令,編輯 httpd.conf 文件并在所需的范圍內(nèi)加入以下指令。

          <Directory /whichever/directory/here>

          ? ? # 包括 任何其他你想要加入這一節(jié)的東西

          ? ? ExpiresActive on

          ? ? ExpiresByType image/gif "access plus 1 year"

          ? ? ExpiresByType text/html "modification plus 2 days"

          ? ? # ExpiresDefault "now plus 0 seconds"

          ? ? ExpiresDefault "now plus 1 month"

          </Directory>

          如果你要在 .htaccess 文件中使用Expires頭,那么你要先編輯 httpd.conf 設(shè)置相應(yīng)的目錄的AllowOverride。Apache只會讀取設(shè)置了“Indexes”覆蓋的目錄中的 .htaccess 。

          # 針對使用.htaccess的目錄,允許Indexes覆蓋

          <Directory /whichever/directory/here>

          ? ? # 包括 任何其他你想要加入這一節(jié)的東西

          ? ? AllowOverride Indexes

          </Directory>

          在相應(yīng)目錄里的 .htaccess 文件中加入Expires指令。站長可以編輯 .htaccess 文件而無需修改 httpd.conf 。

          “.htaccess”方法的主要問題是Indexes覆蓋,這樣 .htaccess 文件將給予站長更多的配置選項(xiàng)而非僅僅Expires頭。這也許并不是系統(tǒng)管理員所期望的。

          候選方法:Cache-Control 頭

          mod_cern_meta 允許文件級的控制,同時它也可以使用Cache-Control頭(或任何其他頭)。響應(yīng)頭是放在原始目錄的子目錄中,根據(jù)原始文件名所命名的一個文件。

          去掉 cern_meta_module 一行的注釋并重新編譯,和上一節(jié)中對 expires_module 的一樣。

          httpd.conf 文件中,打開 MetaFiles on ,將 MetaDirectory 設(shè)置為子目錄名,同時把 MetaSuffix 設(shè)為頭的文件的后綴名。

          MetaFiles on

          MetaDirectory .web

          MetaSuffix .meta

          使用這些值的話,文件 /var/www/www.example.org/index.html 將會以 /var/www/www.example.org/.web/index.html.meta. 為元文件。

          任何有效的HTTP頭都可以放在這些文件中。這提供了另一種使用Expires頭的方式,同時它可以加入Cache-Control頭。相應(yīng)的Cache-Control頭如下:?

          Cache-Control : max-age = [delta-seconds]

          修改失效機(jī)制,將覆蓋Expires頭。Max-age隱含了Canche-Control: public。

          Cache-Control : public

          表示對象可以被存在緩存中。這是默認(rèn)值。?

          Cache-Control : private

          Cache-Control : private = [field-name]

          表示對象(或指定字段)不能被保存在一個共享的緩存中同時是針對一個單獨(dú)的用戶的。它可以被保存在一個私有的緩存中。?

          Cache-Control : no-cache

          Cache-Control : no-cache = [field-name]

          表示對象(或者指定字段)可以被緩存,但不能直接給客戶除非經(jīng)過原始服務(wù)器的重新驗(yàn)證。?

          Cache-Control : no-store

          表示條目不能存儲在持久的存儲媒介中,同時應(yīng)該盡可能快地從非未定存儲媒介中刪除。?

          Cache-Control : no-transform

          代理可以將數(shù)據(jù)從一個存儲系統(tǒng)中轉(zhuǎn)換到另外一個。這個指令表示(大多數(shù))響應(yīng)不能被轉(zhuǎn)換。(RFC允許某些字段的轉(zhuǎn)換,即使存在這個頭)?

          Cache-Control : must-revalidate

          Cache-Control : proxy-revalidate

          強(qiáng)制代理重新驗(yàn)證該頁面即使客戶可以接受一個陳舊的響應(yīng)。請?jiān)谑褂眠@些頭之前閱讀RFC,關(guān)于他們的使用有一些限制。

          警告

          • HTTP/1.0有一個很小的緩存控制機(jī)制,僅能理解Pragma: no-cache頭。使用HTTP/1.0的緩存將忽略Expires和Cache-Control頭。

          • 任何一個Cache-Control指令都不能保證隱私性或者數(shù)據(jù)的安全性?!皃rivate”和“no-store”指令可以為隱私性和安全性方面提供一些幫助,但是他們并不能用于替代身份驗(yàn)證和加密。

          • 本文不能代替RFC。如果你要實(shí)現(xiàn)Cache-Control頭,請閱讀RFC來獲取每個頭的含義和限制的詳細(xì)描述。

          最后的話

          緩存是Internet的現(xiàn)實(shí)問題同時它能讓帶寬的使用更加有效。你的客戶也許是通過一個緩存來瀏覽你的頁面的,有時候還會用多個緩存。給你的頁面加上緩存頭可以保護(hù)你的頁面內(nèi)容也可以讓你的客戶節(jié)省他們的帶寬。?

          進(jìn)一步閱讀

          posted on 2006-08-27 19:27 窮鬼 閱讀(385) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 成都市| 台前县| 秦皇岛市| 襄城县| 沅江市| 扶绥县| 洪洞县| 舞阳县| 泾源县| 珠海市| 永善县| 泰来县| 滨海县| 衡山县| 象州县| 六盘水市| 本溪| 新干县| 秀山| 积石山| 武宣县| 万年县| 阿图什市| 渝中区| 鄄城县| 乌拉特后旗| 华阴市| 宜兴市| 惠州市| 阳江市| 科技| 周至县| 揭东县| 泾源县| 桃江县| 黔东| 济阳县| 泊头市| 和平县| 高台县| 南康市|