緩存友好的網(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ā)送請(qǐng)求的需要,同時(shí)在其他一些情況下消除發(fā)送完整的響應(yīng)的需要。” RFC 2616

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

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

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

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

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

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

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

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

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

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

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

          可用的緩存頭

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

          Expires: <date in RFC 1123 format>

          例如:?

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

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

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

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

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

          主要的方法:Expires頭

          要使用Expires頭,你需要運(yùn)行在Apache 1.2或者更新的版本上,同時(shí)要啟用 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或更新的版本,同時(shí)它已經(jīng)配置為運(yùn)行時(shí)加載模塊,你可以編輯 httpd.conf 然后重新啟動(dòng)Apache而無需重新編譯。)

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

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

          要用到的指令是:

          ExpiresActive on|off

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

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

          base 可以是以下其中之一:

          • access ?

          • now (等同于“access”)

          • modification ?

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

          • years ?

          • months ?

          • weeks ?

          • days ?

          • hours ?

          • minutes ?

          • seconds ?

          如果你準(zhǔn)備對(duì)一個(gè)服務(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只會(huì)讀取設(shè)置了“Indexes”覆蓋的目錄中的 .htaccess

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

          <Directory /whichever/directory/here>

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

          ? ? AllowOverride Indexes

          </Directory>

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

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

          候選方法:Cache-Control 頭

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

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

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

          MetaFiles on

          MetaDirectory .web

          MetaSuffix .meta

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

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

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

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

          Cache-Control : public

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

          Cache-Control : private

          Cache-Control : private = [field-name]

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

          Cache-Control : no-cache

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

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

          Cache-Control : no-store

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

          Cache-Control : no-transform

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

          Cache-Control : must-revalidate

          Cache-Control : proxy-revalidate

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

          警告

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

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

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

          最后的話

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

          進(jìn)一步閱讀

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 金秀| 贡嘎县| 平山县| 濉溪县| 荔波县| 望都县| 黄石市| 阿克陶县| 麻阳| 苗栗市| 大方县| 宾阳县| 旌德县| 阳城县| 仁布县| 栖霞市| 峨山| 白玉县| 南皮县| 泸定县| 邯郸市| 云安县| 奎屯市| 怀宁县| 博罗县| 娱乐| 滕州市| 扶绥县| 迭部县| 称多县| 广西| 板桥市| 富川| 伽师县| 大埔区| 南川市| 洛阳市| 永吉县| 平陆县| 旬邑县| 保康县|