技術(shù)資訊
什么是cache緩存
2016-07-19 11:46:51
一個使用緩存Cache的站點會監(jiān)聽客戶端向服務器端發(fā)出的請求,并保存服務器端的回應——比如HTML頁面、圖片等文件。接著,如果有另外一個使用相同URL發(fā)送請求,他能夠使用之前已經(jīng)保存下來的反饋文件,而不是再次向服務器發(fā)出請求。
有兩個主要的理由讓人們使用緩存:
減少延遲 — 因為所發(fā)出的網(wǎng)頁請求是指向更接近客戶端的緩存而不再是源服務器端,因此請求所花費時間更短,這讓網(wǎng)站看上去反應更快。
降低網(wǎng)絡負荷 — 因為緩存文件可以重復使用,節(jié)省了不少的帶寬.這也給用戶省了不少流量.
緩存 Caches種類
瀏覽器緩存 Caches
在現(xiàn)代瀏覽器(比如IE、Chrome、Mozilla等等)都有緩存設置選項,它可以將你瀏覽過的網(wǎng)頁全部保存到你本地電腦的硬盤中。當你點擊瀏 覽器的“后退”或者曾經(jīng)瀏覽過的頁面的鏈接時就能使用這種緩存了,同樣的,如果你在自己的網(wǎng)站使用導航圖片,瀏覽器緩存也能迅速地做出反應。瀏覽器緩存原理機制(擴展閱讀>>)如下圖所示:
代理緩存 Caches
web代理緩存使用相同的原理,但卻有大得多的規(guī)模,代理可以用相同的方法為幾百甚至幾千的使用者服務;一些大公司和ISPs通常為它們設置了防火墻,或者單獨的設備。
因為代理緩存既不屬于客戶端也不屬于服務器端,而是利用網(wǎng)絡路由請求信息。有一種方式可以做到這一點,就是手動設置瀏覽器的代理。你還可以使用網(wǎng)頁代理,網(wǎng)頁代理將你的url請求通過它潛在的網(wǎng)絡定向到他們,所以用戶甚至無須手動配置它們。
代理緩存是共享緩存的一種,不是只有一個人正在使用它們,而是同時又大量的用戶,因為他們可以非常好的節(jié)約了帶寬和網(wǎng)頁延遲。
網(wǎng)關(guān)緩存
就像前面提到的“反向代理緩存” 和 “代理緩存”,網(wǎng)關(guān)緩存同樣是充當一種代理的角色,通過網(wǎng)絡管理員(或是站長自己),可以讓帶寬更有效的利用,讓他們的網(wǎng)站變得更加可靠。
Content delivery networks (CDNs) 出售他們的緩存服務. Speedera and Akamai 就是非常著名的 CDNs.
緩存對網(wǎng)站的影響? 怎樣正確地使用緩存?
網(wǎng)站的緩存經(jīng)常被誤解,站長認為代理緩存可以“隱藏”起來,給他們的用戶帶去麻煩的同時,又不能及時地更新網(wǎng)站的內(nèi)容。本教程可以讓你網(wǎng)站的教程變 得友好起來。CDNs不像代理緩存,他們的網(wǎng)關(guān)服務緩存可以根據(jù)網(wǎng)站自行設置。另一方面,這種緩存還能加快你網(wǎng)站的加載速度,用戶體驗得到質(zhì)的提高。
許多大公司花費了幾百萬美金在全世界的進行服務器集群來復制他們的網(wǎng)站內(nèi)容,就是為了保證使用網(wǎng)站的用戶能保持最快的響應速度。緩存能夠為你做同樣的事,甚至可以說緩存更接近終端用戶,而這一切是免費的。
不管你愿不愿意,代理緩存和瀏覽器緩存是既存的事實。如果你不能夠正確地配置你網(wǎng)站緩存,網(wǎng)站將始終保持緩存功能。
網(wǎng)站緩存的工作原理
所有的緩存都有一整套工作機制(當然,在緩存沒有被禁止的前提下),其中一些規(guī)則來自于HTTP協(xié)議(擴展閱讀>>)(HTTP 1.0 和 1.1),另一些則來自管理員(有可能是瀏覽器,也有可能是代理)。
通常來說,它們有一些共有的規(guī)則:
header響應頭部分可以設置了是否進行緩存.
如果請求是經(jīng)過HTTP 認證 (HTTP AUTH擴展閱讀>>)或是SSL安全鏈接 (i.e., HTTPS),緩存也無法工作.
如果符合以下條件,緩存機制的啟用是通過頁面的刷新引起(不需要經(jīng)過檢測服務器就可以直接發(fā)送到客戶端):
時間沒有超過已設置的緩存頁面過期時間或者其它類似 age-controlling(指示客戶機可以接收生存期不大于指定時間的響應) 的設置。
緩存是最近請求時保存的,或是緩存修改的時間也是新的。
當資源過期時(使用Cache-Control標識的max-age),發(fā)現(xiàn)資源具有Last-Modified(Etag)聲明,則再次向web服務器請求時帶上頭 If-Modified-Since(If-None-Match),表示客戶端請求時間。web服務器收到請求后發(fā)現(xiàn)有頭If-Modified-Since(If-None-Match)則與被請求資源的最后修改時間進行比對。若最后修改時間較新,說明資源又被改動過,則響應整片資源內(nèi)容(寫在響應消息包體內(nèi)),HTTP 200;若最后修改時間較舊,說明資源無新修改,則響應HTTP 304 (無需包體,節(jié)省瀏覽),告知瀏覽器繼續(xù)使用所保存的cache。
特定情況— 比如, 與服務器斷開連接 — 緩存會直接作為請求的響應.
刷新和驗證都是緩存機制作用于網(wǎng)站內(nèi)容的方式,用戶行為和瀏覽器緩存之間的聯(lián)系可參考下圖:
用戶行為和瀏覽器緩存
用戶行為和瀏覽器緩存
如何設置網(wǎng)站的緩存 Caches
有一些工具可以幫助站長和開發(fā)人員為他們的網(wǎng)站設置緩存。它可能會要求配置你的服務器,更具體的內(nèi)容點擊這里Implementation。
HTML Meta 標簽Tags vs. HTTP 報頭Headers
我們可以在HTML文件中的<HEAD>部分寫入tag標簽來描述該文件的屬性。meta tags 常??梢杂脕順撕炍募欠駟⒂镁彺婧驮O置緩存的過期時間。Meta tags 很容易使用,但是卻很沒效率.那是因為他們只對瀏覽器部分的緩存有用,而代理緩存(代理從來不會讀取HTML文件). 如果你的主機放在ISP或者集群服務器,他們講不會給你隨意寫入HTTP協(xié)議的權(quán)限 (Expires 以及Cache-Control).
另一方面,真正的 HTTP headers 是不能在 HTML文件里看到的,他們通常由Web服務器自動地生成. 即使這樣,你仍然可以依據(jù)網(wǎng)站所在的服務器,在某種程度上控制它們。接下來,你講發(fā)現(xiàn)HTTP 協(xié)議headers 十分有趣.
HTTP headers 在服務器端發(fā)送HTML之前就已經(jīng)傳輸了, 你只能通過類似firebug之類的瀏覽器插件檢查. 典型的 HTTP 1.1 頭部響應就像下面這段代碼:
HTTP/1.1 200 OK
Date: Fri, 30 Oct 1998 13:19:41 GMT
Server: Apache/1.3.3 (Unix)
Cache-Control: max-age=3600, must-revalidate
Expires: Fri, 30 Oct 1998 14:19:41 GMT
Last-Modified: Mon, 29 Jun 1998 02:28:12 GMT
ETag: "3e86-410-3596fbbc"
Content-Length: 1040
Content-Type: text/html
HTML將出現(xiàn)在這些頭部信息的下面,更多設置HTTP Headers方法Implementation點擊這里.
Pragma HTTP Headers (為什么HTTP頭對緩存不起作用?)
許多人相信設置一個 Pragma: no-cache HTTP 協(xié)議可以控制緩存是否開啟。這其實不是完全正確的。HTTP 協(xié)議的詳細說明中并沒有設置任何有關(guān)Pragma的條例,相反,Pragma請求十分有爭議。雖然一部分緩存會受到此參數(shù)的影響,但大多數(shù)一點作用也沒有,請使用header頭協(xié)議代替它!
HTTP Header 控制緩存更新
過期HTTP 協(xié)議header是控制緩存的基本意義所在。它能夠告訴所有的緩存生存時間。超過了那個時間,緩存就要去請求一次服務器來查看網(wǎng)頁文件是否已經(jīng)更新。過期時間的頭部設置幾乎支持所有的緩存。
大多數(shù)的網(wǎng)站服務器允許你有好幾種的方式來設置過期頭部信息。通常,允許設置一個確定的過期時間(與用戶最新一次發(fā)出請求的時間做對比),或者是服務器端的最后一次修改網(wǎng)頁文件的時間。
過期時間的頭部設置尤其對生成靜態(tài)的圖片有好處(比如logo,按鈕等)。因為他們不會有太多的改動,你能夠?qū)λ鼈冊O置很長的過期時間,使得你的站 點響應更快。這種方式對更新很有規(guī)律的頁面同樣受用。比如,如果你更新一個新聞頁面在每天6點鐘左右,你就可以把過期時間設置為那個時間點,這樣一來,即 使你的用戶沒有點擊“重新加載”也能夠更新緩存。
注意:Expires的值是HTTP協(xié)議日期,任何其它值都會被當做 已過期緩存的時間,這就會直接導致無法進行頁面緩存。HTTP協(xié)議日期是格林威治時間而不是你的本地時間。
For example:
Expires: Fri, 30 Oct 1998 14:19:41 GMT
當你要使用Expires 參數(shù)時,確保你的網(wǎng)站服務器時間精確,這一點非常重要。你可以用 Network Time Protocol (NTP)做到這一點。雖然Expires 過期時間的設置很有用,但是依然限制很多,首先,它涉及一個時間,網(wǎng)站服務器時間必須和緩存時間保持同步。另一問題就是,你很容易忘記一些已經(jīng)設置了Expires 的網(wǎng)頁,如果你沒有在超過網(wǎng)站的過期時間之前更新 Expires,以后的每個請求都會返回到您的Web服務器,增加負載和延遲。
HTTP Header 參數(shù)Cache-Control
HTTP 1.1 ( 互動百科 | 維基百科 ) 引入了 Cache-Control 響應頭參數(shù)以給站長們更多控制網(wǎng)站內(nèi)容的權(quán)力,同時彌補了 Expires的局限.
Cache-Control 的參數(shù)包括:
max-age=[單位:秒 seconds] — 設置緩存最大的有效時間. 類似于 Expires, 但是這個參數(shù)定義的是時間大?。ū热纾?0)而不是確定的時間點.單位是[秒 seconds].
s-maxage=[單位:秒 seconds] — 類似于 max-age, 但是它只用于公享緩存 (e.g., proxy) .
public — 響應會被緩存,并且在多用戶間共享。正常情況, 如果要求 HTTP 認證,響應會自動設置為 private.
private — 響應只能夠作為私有的緩存(e.g., 在一個瀏覽器中),不能再用戶間共享。
no-cache — 響應不會被緩存,而是實時向服務器端請求資源。這一點很有用,這對保證HTTP 認證能夠嚴格地禁止緩存以保證安全性很有用(這是指頁面與public結(jié)合使用的情況下).既沒有犧牲緩存的效率,又能保證安全。
no-store — 在任何條件下,響應都不會被緩存,并且不會被寫入到客戶端的磁盤里,這也是基于安全考慮的某些敏感的響應才會使用這個。
must-revalidate — 響應在特定條件下會被重用,以滿足接下來的請求,但是它必須到服務器端去驗證它是不是仍然是最新的。
proxy-revalidate — 類似于 must-revalidate,但不適用于代理緩存.
For example:
Cache-Control: max-age=3600, must-revalidate
如果Cache-Control 和 Expires 同時設置, Cache-Control 優(yōu)先.如果你打算使用 Cache-Control ,別忘記好好看看關(guān)于 HTTP 1.1協(xié)議的文檔?!静榭?References and Further Information更多相關(guān)信息>>.】
緩存的驗證程序
之前我們討論過 網(wǎng)站緩存是如何工作的?,我們所討論的緩存驗證指,當響應的資源做出了改變時,服務器與緩存之間的通信所使用的驗證。通過這種驗證,如果在本地已有一份拷貝資源,緩存就可以避免下載整個資源文件。
驗證器十分重要:假如沒有它,就沒有更新的報頭(Expires or Cache-Control), 緩存將無法存儲響應資源.大多數(shù)的驗證程序是記錄了資源最后一次修改的時間(報頭參數(shù)中的Last-Modified),當緩存保存了包含參數(shù)Last-Modified的響應資源時,它將使用一個包含參數(shù)If-Modified-Since的請求與服務器上資源的最后修改時間做對比,以查看資源是否已作出改變。
HTTP 1.1 協(xié)議同時引入一個新的驗證器,名為Etag。這種驗證器擁有特殊的標示符,它來自于服務器,并且隨著響應資源的改變而改變。簡單點即 服務器響應時給請求URL標記,并在HTTP響應頭中將其傳送到客戶端,在Http響應頭中包含 Etag:“5d8c72a5edda8d6a:3239”標識,等于告訴客戶端,你拿到的這個的資源有表示 ID:5d8c72a5edda8d6a:3239。當下次需要發(fā)Request索要同一個URI的時候,瀏覽器同時發(fā)出一個If-None-Match 報頭(Http RequestHeader)此時包頭中信息包含上次訪問得到的,即Etag:“5d8c72a5edda8d6a:3239”標識:
If-None-Match:"5d8c72a5edda8d6a:3239"
這樣,客戶端等于Cache了兩份,服務器端就會比對2者的Etag。如果If-None-Match為False,返回304(緩存讀取) ,不返回200(服務器讀取)。
幾乎所有的緩存都是使用了 Last-Modified作為驗證器,而Etag有更高的優(yōu)先權(quán)。大多數(shù)的網(wǎng)站服務器將自動產(chǎn)生 ETag 及 Last-Modified作為靜態(tài)內(nèi)容的驗證器(i.e., files);你不需要做任何改變。但是,對于動態(tài)內(nèi)容(像CGI, PHP or database sites之類)卻毫無作用;你可以查看本文介紹的相關(guān)內(nèi)容怎樣寫動態(tài)網(wǎng)站的緩存腳本.
設置優(yōu)良的網(wǎng)站緩存機制方法
有很多的方法可以讓你的網(wǎng)站緩存更加友好:
使用一致的 URLs — 這是使用緩存的黃金法則.如果你為不同的用戶提供、或是從不同的網(wǎng)站采集相同的內(nèi)容到不同的網(wǎng)站頁面,請使用一條URL地址。For example,如果你一旦使用了 “/index.html” ,對于其他的 HTML 文件URL也采用相同的命名方式.
使用圖片庫 來查閱不同地方使用的圖片.
創(chuàng)建緩存保存不常變動的圖片和頁面 ,可以把參數(shù) Cache-Control: max-age 報頭參數(shù)的值設置得大些.
為規(guī)律更新的網(wǎng)頁設置定時緩存, 可以設置合適的 max-age or expiration 時間參數(shù).
如果一個資源(尤其是可下載文件)改變了,把它的名字也改了. 用這種方式,你可以讓緩存在很長的一段時間之后才過期,并且保證提供的版本是正確的。鏈接到改資源的網(wǎng)頁需要將緩存時間設置得短一些.
除非必要,不要隨意修改文件. 如果隨意修改,報頭參數(shù) Last-Modified 將始終使用最新的日期.比如,當你升級網(wǎng)站,不要復制整個站點; 只要移動你修改的文件即可.
只在有必要的地方使用cookies — cookies 非常難緩存, 大多數(shù)情況也沒必要緩存.如果你一定需要有cookies,將它們限制在動態(tài)頁面中.
盡量少地使用 SSL安全協(xié)議 — 因為加密的頁面將不會采用共享緩存的方式儲存,盡量在需要的時候使用SSL, 并且在SSL頁面盡量少用圖片.
用 REDbot檢測你的網(wǎng)站頁面— 本教程所描述的大多數(shù)概念在使用該工具時都很有用.
怎樣寫動態(tài)網(wǎng)站的緩存腳本
默認情況下,大多數(shù)的腳本語言將不會返回驗證器(Last-Modified or ETag 響應頭)或者緩存更新提示(Expires or Cache-Control)。同時,一些真正的腳本語言是動態(tài)的(意味著他們對每個請求返回不同的響應資源),大多數(shù)站點(像搜索引擎和數(shù)據(jù)庫驅(qū)動站點)都能從緩存腳本從受益。
一般來講,如果在間隔的時間段(不管是相差幾天還是幾分鐘),發(fā)出相同的請求,能夠復寫一個腳本輸出,那么它就能夠緩存。如果腳本輸出的內(nèi)容會隨著URL的改變而改變,也是可以進行緩存的;但是如果腳本輸出要依賴cookies,認證等,則不能緩存。
寫一個優(yōu)良的緩存腳本的最好辦法是:不管內(nèi)容何時更改,都將腳本的內(nèi)容輸出到普通的文件中,以便網(wǎng)站的服務器能夠想其他網(wǎng)頁一樣對待它,從而生成和使用緩存的驗證器。記住只對那些已經(jīng)改變的文件進行寫入,這樣可以讓Last-Modified 的值被保護起來.
另一個讓腳本可以緩存的方法是,設置一個有關(guān)存活時間的響應頭,值設置為腳本能夠使用的時間。雖然 Expires設置可以實現(xiàn)這一點,但是設置 Cache-Control: max-age是最簡單的, 它可以在一次請求發(fā)生后的一段時間里又發(fā)出新的請求。
如果你不能做到這些,你將需要讓腳本生成一個驗證器,然后對瀏覽器發(fā)出請求中的 If-Modified-Since 和/或 If-None-Match做出響應. 通過分析HTTP 頭你能夠做到這一點,只要在適當?shù)臅r候返回304(緩存讀取)響應狀態(tài)即可。
小技巧:
如非必要,盡量不使用 POST方式. 大多數(shù)的緩存無法保持對POST方式響應,你過你想通過路徑或請求(GET)發(fā)送一些信息,緩存能夠在未來存貯信息。
除非整個內(nèi)容是要呈現(xiàn)給完整的用戶,否則不要用URL來傳遞用戶的身份信息.
不要指望來自一個用戶的所有請求都是從同一個主機發(fā)出的, 因為緩存經(jīng)常一起產(chǎn)生作用.
設置響應頭中的Content-Length (用于描述HTTP消息實體的傳輸長度). 它允許你的腳本可以在長連接通信時仍有響應,并且客戶端可以通過一個TCP/IP連接請求不同的資源,而不是為一次請求的都建立一個通信.
點擊查看更多內(nèi)容.
緩存常見問題大全
哪些內(nèi)容是需要設置為緩存的?
有一個很好的策略,確定出網(wǎng)站最多人瀏覽、數(shù)據(jù)量(尤其是圖片)最大的部分。
我怎樣用緩存讓我的網(wǎng)頁盡可能快?
大多數(shù)的緩存響應資源都設置了刷新請求時間,緩存驗證可以幫助你減少查看資源是否更新的時間,但是緩存始終是需要和服務器通信來檢查更新的。
我已經(jīng)知道緩存的優(yōu)勢,但我需要為我的頁面統(tǒng)計流量數(shù)據(jù)!
如果你必須知道頁面每次被瀏覽的數(shù)據(jù),你可以在頁面上分類一小部分設置為不緩存,比如,將一個 1*1大小的圖片放到每一個頁面中,相關(guān)的響應頭將包含所在頁面的信息。
考慮到這樣做不僅無法統(tǒng)計有關(guān)準確的用戶數(shù)據(jù),并且有害于網(wǎng)絡和用戶(產(chǎn)生無效流量,增加延遲時間),你可以考慮使用第三方統(tǒng)計工具 相關(guān)信息>>.
如何查看HTTP 協(xié)議頭?
許多瀏覽器可以在頁面信息中查看到 Expires 和 Last-Modified 頭部參數(shù),也可用Chrome 或是 Mozilla 的firebug查看.
如果響應更完整的響應頭信息,你可以用Telnet客戶端來連接網(wǎng)站,方法如下:
第一步:在“開始”菜單中,點擊“運行”命令,輸入“telnet ec-shalom.com:80”。
第二步:打開本地顯示。輸入你想要查看的響應頭地址,比如,你想查看頁面 http://ec-shalom.com/683_webfilecoding.html
GET /683_webfilecoding.html HTTP/1.1 [return]
Host: ec-shalom.com [return][return]
每次看到 [return]時按下回車; 最后要點擊兩次回車.它將打印所有頭部信息,和響應資源,如果只需要頭部信息,將GET換成HEAD 。
我的頁面設置了密碼保護,代理緩存會怎樣處理它們呢?
默認情況下,設置了HTTP認證的頁面會被當做private處理;它們將不會被共享緩存保存下來。然而,你能通過頁面頭部設置參數(shù) Cache-Control來達到目的;HTTP 1.1-協(xié)議將會采用緩存.
如果你想要這個頁面能夠被緩存起來,但是卻能夠驗證每一個用戶,將 Cache-Control: public 和 no-cache 結(jié)合起來. 它讓客戶端發(fā)送的驗證信息在連接數(shù)據(jù)庫之前先讀取了緩存內(nèi)容:
Cache-Control: public, no-cache
不管怎樣,盡量少地使用驗證;比如,如果你頁面的圖片是沒必要經(jīng)過驗證的,你就把他們放到單獨的文件夾中,并且配置你的服務器不要驗證它。
通過緩存瀏覽我的網(wǎng)站是否安全?
代理服務器上SSL頁面不會被緩存(不推薦被緩存),所以你不必為此擔心。但是,由于緩存保存了非SSL請求和從他們抓取的URL,你要意識到?jīng)]有安全保護的網(wǎng)站,可能被不道德的管理員可能搜集用戶隱私,特別是通過URL。
實際上,位于服務器和客戶端之間的管理員可以搜集這類信息。特別是通過CGI腳本在通過URL傳遞用戶名和密碼的時候會有很大問題;這對泄露用戶名和密碼是一個很大的漏洞;
如果你初步懂得互聯(lián)網(wǎng)的安全機制,你不會對緩存服務器有任何。
我在尋找一個包含在Web發(fā)布系統(tǒng)解決方案,那些是比較有緩存意識的系統(tǒng)?
這很難說,一般說來系統(tǒng)越復雜越難緩存。最差就是全動態(tài)發(fā)布并不提供校驗參數(shù);你無發(fā)緩存任何內(nèi)容??梢韵蛳到y(tǒng)提供商的技術(shù)人員了解一下,并參考后面的實現(xiàn)說明。
我的圖片設置了1個月后過期,但是我現(xiàn)在需要現(xiàn)在更新。
過期時間是繞不過去的,除非緩存(瀏覽器或者代理服務器)空間不足才會刪除副本,緩存副本在過期之間會被一直使用。
最好的辦法是改變它們的鏈接,這樣,新的副本將會從源服務器上重新下載。記住:引用它們的頁面本身也會被緩存。因此,使用靜態(tài)圖片和類似內(nèi)容是很容易緩存的,而引用他們的HTML頁面則要保持非常更新;
如果你希望對指定的緩存服務器重新載入一個副本,你可以強制使用“刷新”(在FireFox中在reload的時候按住shift鍵:就會有前面提到惡Pragma: no-cache頭信息發(fā)出)?;蛘吣憧梢宰尵彺娴墓芾韱T從他們的界面中刪除相應內(nèi)容;
我運行一個Web托管服務,如何讓我的用戶發(fā)布緩存友好的網(wǎng)頁?
如果你使用apahe,可以考慮允許他們使用.htaccess文件并提供相應的文檔;
另外一方面: 你也可以考慮在各種虛擬主機上建立各種緩存策略。例如: 你可以設置一個目錄 /cache-1m 專門用于存放訪問1個月的訪問,另外一個 /no-cache目錄則被用提供不可存儲副本的服務。
無論如何:對于大量用戶訪問還是應該用緩存。對于大網(wǎng)站,這方面的節(jié)約很明顯(帶寬和服務器負載);
我標記了一些網(wǎng)頁是可緩存的,但是瀏覽器仍然每次發(fā)送請求給服務。如何強制他們保存副本?
緩存服務器并不會總保存副本并重用副本;他們只是在特定情況下會不保存并使用副本。所有的緩存服務器都回基于文件的大小,類型(例如:圖片 頁面),或者服務器空間的剩余來確定如何緩存。你的頁面相比更熱門或者更大的文件相比,并不值得緩存。
所以有些緩存服務器允許管理員根據(jù)文件類型確定緩存副本的優(yōu)先級,允許某些副本被永久緩存并長期有效;
緩存機制的實現(xiàn) - Web服務器端配置
一般說來,應該選擇最新版本的Web服務器程序來部署。不僅因為它們包含更多利于緩存的功能,新版本往往在性能和安全性方面都有很多的改善。
Apache HTTP服務器
Apache有些可選的模塊來包含這些頭信息: 包括Expires和Cache-Control。 這些模塊在1.2版本以上都支持;
這些模塊需要和apache一起編譯;雖然他們已經(jīng)包含在發(fā)布版本中,但缺省并沒有啟用。為了確定相應模塊已經(jīng)被啟用:找到httpd程序并運行httpd -l 它會列出可用的模塊,我們需要用的模塊是mod_expires和mod_headers
如 果這些模塊不可用,你需要聯(lián)系管理員,重新編譯并包含這些模塊。這些模塊有時候通過配置文件中把注釋掉的配置啟用,或者在編譯的時候增加-enable -module=expires和-enable-module=headers選項(在apache 1.3和以上版本)。 參考Apache發(fā)布版中的INSTALL文件;
Apache一旦啟用了相應的模塊,你就可以在.htaccess文件或者在服務器的access.conf文件中通過mod_expires設置副本什 么時候過期。你可設置過期從訪問時間或文件修改時間開始計算,并且應用到某種文件類型上或缺省設置,參考模塊的文檔獲得更多信息,或者遇到問題的時候向你身邊的apache專家討教。
應用Cache-Control頭信息,你需要使用mod_headers,它將允許你設置任意的HTTP頭信息,參考mod_headers的文檔可以獲得更多資料;
這里有個例子說明如何使用頭信息:
.htaccess文件允許web發(fā)布者使用命令只在配置文件中用到的命令。他影響到所在目錄及其子目錄;問一下你的服務器管理員確認這個功能是否啟用了。
### 啟用 mod_expires
ExpiresActive On
### 設置 .gif 在被訪問過后1個月過期。
ExpiresByType image/gif A2592000
### 其他文件設置為最后修改時間1天后過期
### (用了另外的語法)
ExpiresDefault "modification plus 1 day"
### 在index.html文件應用 Cache-Control頭屬性
<Files index.html>
Header append Cache-Control "public, must-revalidate"
</Files>
注意: 在適當情況下mod_expires會自動計算并插入Cache-Control:max-age 頭信息
Apache 2.0的配置和1.3類似,更多信息可以參考2.0的mod_expires和mod_headers文檔;
Microsoft IIS服務器
Microsoft的IIS可以非常容易的設置頭信息,注意:這只針對IIS 4.0服務器,并且只能在NT服務器上運行。
為網(wǎng)站的一個區(qū)域設置頭信息,先要到管理員工具界面中,然后設置屬性。選擇HTTP Header選單,你會看到2個有趣的區(qū)域:啟用內(nèi)容過期和定制HTTP頭信息。頭一個設置會自動配置,第二個可以用于設置Cache-Control頭信息;
設置asp頁面的頭信息可以參考后面的ASP章節(jié),也可以通過ISAPI模塊設置頭信息,細節(jié)請參考MSDN。
Netscape/iPlanet企業(yè)服務器
3.6版本以后,Netscape/iPlanet已經(jīng)不能設置Expires頭信息了,他從3.0版本開始支持HTTP 1.1的功能。這意味著HTTP 1.1的緩存(代理服務器/瀏覽器)優(yōu)勢都可以通過你對Cache-Control設置來獲得。
使用Cache-Control頭信息,在管理服務器上選擇內(nèi)容管理|緩存設置目錄。然后:使用資源選擇器,選擇你希望設置頭信息的目錄。設置完頭信息后,點擊“OK”。更多信息請參考Netscape/iPlanet企業(yè)服務器的手冊。
緩存機制的實現(xiàn):服務器端腳本
需要注意的一點是:也許服務器設置HTTP頭信息比腳本語言更容易,但是兩者你都應該使用。
因為服務器端的腳本主要是為了動態(tài)內(nèi)容,他本身不產(chǎn)生可緩存的文件頁面,即使內(nèi)容實際是可以緩存的。如果你的內(nèi)容經(jīng)常改變,但是不是每次頁面請求都改變, 考慮設置一個Cache-Control: max-age頭信息;大部分用戶會在短時間內(nèi)多次訪問同一頁面。例如: 用戶點擊“后退”按鈕,即使沒有新內(nèi)容,他們?nèi)匀灰俅螐姆掌飨螺d內(nèi)容查看。
CGI程序
CGI腳本是生成內(nèi)容最流行的方式之一,你可以很容易在發(fā)送內(nèi)容之前的擴展HTTP頭信息;大部分CGI實現(xiàn)都需要你寫 Content-Type頭信息,例如這個Perl腳本:
#!/usr/bin/perl
print "Content-type: text/html\n";
print "Expires: Thu, 29 Oct 1998 17:04:19 GMT\n";
print "\n";
### 后面是內(nèi)容體...
由于都是文本,你可以很容易通過內(nèi)置函數(shù)生成Expires和其他日期相關(guān)的頭信息。如果你使用Cache-Control: max-age;會更簡單;
print "Cache-Control: max-age=600\n";
這樣腳本可以在被請求后緩存10分鐘;這樣用戶如果按“后退”按鈕,他們不會重新提交請求;
CGI的規(guī)范同時也允許客戶端發(fā)送頭信息,每個頭信息都有一個‘HTTP_’的前綴;這樣如果一個客戶端發(fā)送一個If-Modified-Since請求,就是這樣的:
HTTP_IF_MODIFIED_SINCE = Fri, 30 Oct 1998 14:19:41 GMT
參考一下cgi_buffer庫,一個自動處理ETag的生成和校驗的庫,生成Content-Length屬性和對內(nèi)容進行g(shù)zip壓縮。在Python腳本中也只需加入一行;
服務器端包含 Server Side Includes
SSI(經(jīng)常使用.shtml擴展名)是網(wǎng)站發(fā)布者最早可以生成動態(tài)內(nèi)容的方案。通過在頁面中設置特別的標記,也成為一種嵌入HTML的腳本;
大部分SSI的實現(xiàn)無法設置校驗器,于是無法緩存。但是Apache可以通過對特定文件的組執(zhí)行權(quán)限設置實現(xiàn)允許用戶設置那種SSI可以被緩存;結(jié)合XbitHack調(diào)整整個目錄。更多文檔請參考mod_include文檔。
PHP
PHP是一個內(nèi)建在web服務器中的服務器端腳本語言,當做為HTML嵌入式腳本,很像SSI,但是有更多的選項,PHP可以在各種Web服務器上設置為CGI模式運行,或者做為Apache的模塊;
缺省PHP生成副本沒有設置校驗器,于是也無法緩存,但是開發(fā)者可以通過Header()函數(shù)來生成HTTP的頭信息;
例如:以下代碼會生成一個Cache-Control頭信息,并設置為3天以后過期的Expires頭信息;
<?php
Header("Cache-Control: must-revalidate");$offset = 60 * 60 * 24 * 3;
$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
Header($ExpStr);
?>
記住: Header()的輸出必須先于所有其他HTML的輸出;
正如你看到的:你可以手工創(chuàng)建HTTP日期;PHP沒有為你提供專門的函數(shù)(新版本已經(jīng)讓這個越來越容易了,請參考PHP的日期相關(guān)函數(shù)文檔),當然,最簡單的還是設置Cache-Control: max-age頭信息,而且對于大部分情況都比較適用;
更多信息,請參考header相關(guān)的文檔;
也請參考一下cgi_buffer庫,自動處理ETag的生成和校驗,Content-Length生成和內(nèi)容的gzip壓縮,PHP腳本只需包含1行代碼;
Cold Fusion
Cold Fusion是Macromedia的商業(yè)服務器端腳本引擎,并且支持多種Windows平臺,Linux平臺和多種Unix平臺。Cold Fusion通過CFHEADER標記設置HTTP頭信息相對容易。可惜的是:以下的Expires頭信息的設置有些容易誤導;
<CFHEADER NAME="Expires" VALUE="#Now()#">
它并不像你想像的那樣工作,因為時間(本例中為請求發(fā)起的時間)并不會被轉(zhuǎn)換成一個符合HTTP時間,而且打印出副本的Cold fusion的日期/時間對象,大部分客戶端會忽略或者將其轉(zhuǎn)換成1970年1月1日。
但是:Cold Fusion另外提供了一套日期格式化函數(shù), GetHttpTimeSTring. 結(jié)合DateAdd函數(shù),就很容易設置過期時間了,這里我們設置一個Header聲明副本在1個月以后過期;
<cfheader name="Expires" value="#GetHttpTimeString(DateAdd('m', 1, Now()))#">
你也可以使用CFHEADER標簽來設置Cache-Control: max-age等其他頭信息;
記?。篧eb服務器也會將頭信息設置轉(zhuǎn)給Cold Fusion(做為CGI運行的時候),檢查你的服務器設置并確定你是否可以利用服務器設置代替Cold Fusion。
ASP和ASP.NET
在asp中設置HTTP頭信息是:確認Response方法先于HTML內(nèi)容輸出前被調(diào)用,或者使用 Response.Buffer暫存輸出;同樣的:注意某些版本的IIS缺省設置會輸出Cache-Control: private 頭信息,必須聲明成public才能被共享青島網(wǎng)站設計緩存服務器緩存。
IIS的ASP和其他web服務器都允許你設置HTTP頭信息,例如: 設置過期時間,你可以設置Response對象的屬性;
<% Response.Expires=1440 %>
設置請求的副本在輸出的指定分鐘后過期,類似的:也可以設置絕對的過期時間(確認你的HTTP日期格式正確)
<% Response.ExpiresAbsolute=#May 31,1996 13:30:15 GMT# %>
Cache-Control頭信息可以這樣設置:
<% Response.CacheControl="public" %>
在ASP.NET中,Response.Expires 已經(jīng)不推薦使用了,正確的方法是通過Response.Cache設置Cache相關(guān)的頭信息;
Response.Cache.SetExpires ( DateTime.Now.AddMinutes ( 60 ) ) ;
Response.Cache.SetCacheability ( HttpCacheability.Public ) ;
參考MSDN文檔可以找到更多相關(guān)新年系;
近期更新
- [2023-07-26 14:17:28] 為品牌賦能,海外官網(wǎng)品牌數(shù)字化
- [2023-05-06 10:32:26] 青島網(wǎng)站建設公司,高端網(wǎng)站定制,一站式網(wǎng)站服務——力圖數(shù)字科技
- [2023-04-27 13:47:54] 高端定制網(wǎng)站建設——從滿足預期到走向卓越
- [2023-04-11 09:17:49] H5頁面設計開發(fā)——移動端傳播利器
- [2022-11-16 10:11:43] windows2012程序在哪
- [2022-04-14 11:01:47] 力圖數(shù)字科技配套網(wǎng)站服務支持
- [2021-05-18 10:14:11] 青島網(wǎng)站建設的流程
- [2021-04-29 10:14:38] 企業(yè)定制化官網(wǎng)建設項目
- [2021-03-05 10:34:45] 移動互聯(lián)時代房地產(chǎn)行業(yè)的微信小程序解決方案
- [2021-01-22 17:29:38] 微信小程序有哪些優(yōu)勢?為什么要開發(fā)微信小程序?
- [2021-01-08 17:28:04] 網(wǎng)站建設最容易忽略的人性化設計
- [2020-12-16 16:55:32] 建設一個常規(guī)的公司網(wǎng)站建設成本大概是多少?
延伸閱讀
- [2011-11-07 23:02:37] 青島網(wǎng)頁設計中最常用到的設計細節(jié)
- [2012-02-12 17:41:48] 網(wǎng)站設計趨勢-設計演化史
- [2012-01-26 21:46:03] 如何添加nofollow
- [2011-12-27 19:20:52] UCenter與微博整合教程
- [2013-12-29 23:05:47] 個性化的網(wǎng)站設計思路-旋轉(zhuǎn)和平移
- [2014-11-08 23:01:19] 如何在百度知道發(fā)外鏈
- [2014-10-08 21:24:15] 面包屑導航在網(wǎng)站優(yōu)化上的作用
- [2014-12-02 23:16:32] 新老網(wǎng)站被百度K站后的原因分析與解決辦法
- [2014-11-13 09:36:21] 個人經(jīng)驗教訓及建議與大家分享
- [2014-09-02 22:20:27] 反饋表JS郵件地址驗證代碼
- [2011-10-17 09:52:27] 如何解決服務器虛擬化帶來的五大難題?
- [2012-02-16 16:49:09] 網(wǎng)站設計趨勢-門戶站的細分設計
解決方案
輪胎行業(yè)網(wǎng)站設計解決方案 機械行業(yè)網(wǎng)站設計解決方案 房地產(chǎn)行業(yè)網(wǎng)站設計解決方案 科技企業(yè)網(wǎng)站設計解決方案 電子家電網(wǎng)站設計解決方案 食品行業(yè)網(wǎng)站設計解決方案 集團公司網(wǎng)站設計解決方案 企事業(yè)單位網(wǎng)站設計解決方案 外貿(mào)行業(yè)網(wǎng)站設計解決方案 健身運動網(wǎng)站設計解決方案 美容與化妝品網(wǎng)站設計解決方案 建筑設計行業(yè)網(wǎng)站設計解決方案 物流行業(yè)網(wǎng)站設計解決方案
TAGS關(guān)鍵字
青島網(wǎng)站建設基礎(chǔ)知識 青島網(wǎng)頁制作 網(wǎng)站交互設計 企業(yè)網(wǎng)站建設 外貿(mào)網(wǎng)站建設 外貿(mào)網(wǎng)站設計 青島輪胎網(wǎng)站設計 蘋果系統(tǒng) 用戶界面 青島抖音小程序開發(fā) 青島SEO 青島網(wǎng)站建設公司哪家好 集團性網(wǎng)站 HTML5 網(wǎng)站開發(fā) 網(wǎng)站的速度 青島不錯的英文網(wǎng)站建設公司 手機網(wǎng)站 互聯(lián)網(wǎng) 建站常識 程序開發(fā) 搜索引擎蜘蛛 企業(yè)建站 H5專題頁面 青島網(wǎng)絡公司 版面布局 robots 審美 交互設計 青島flash網(wǎng)站