瀏覽器緩存,就完全不是那么回事了,緩存內(nèi)容存儲在瀏覽器本地,而內(nèi)容卻由web服務(wù)器生成,任何一方都不可能獨(dú)立完成這一系統(tǒng)過程,所以它們之間必須有一種溝通機(jī)制,這就是http中的“緩存協(xié)商”。
我們先來看一個通常的http請求:
- host m.survivalescaperooms.com
- user-agent mozilla/5.0 (windows; u; windows nt 6.1; zh-cn; rv:1.9.2.9) gecko/20100824 firefox/3.6.9 firephp教程/0.4
- accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- accept-language zh-cn,zh;q=0.5
- accept-encoding gzip,deflate
- accept-charset gb2312,utf-8;q=0.7,*;q=0.7
- keep-alive 115 //開源代碼Vevb.com
- connection keep-alive
上面就是一個普通的http請求,為了實(shí)現(xiàn)在瀏覽器緩存控制,我們需要了解http響應(yīng)頭中的四種標(biāo)記:
last-modified:最后修改gmt時間
etag:通過一串編碼來標(biāo)記內(nèi)容是否更改過
expires:指定一個過期gmt時間
cache-control:mag-age=相對于瀏覽器本地的過期秒數(shù),可避免服務(wù)器時間不正確的情況下同樣起作用.
http返回的狀態(tài)代碼:
200——請求成功
304——客戶端已經(jīng)執(zhí)行了get,但文件未變化
400——錯誤請求,如語法錯誤
500——服務(wù)器產(chǎn)生內(nèi)部錯誤
501——服務(wù)器不支持請求的函數(shù)
以下代碼使用了以上四種方法來控制瀏覽器內(nèi)容緩存一個小時,如果在一小時之內(nèi)則立即返回304狀態(tài)碼通知瀏覽器使用本地的內(nèi)容,這將節(jié)省服務(wù)器程序執(zhí)行時間,網(wǎng)絡(luò)傳輸時間,僅返回一個頭文件.
- $modified_time = $_server['http_if_modified_since'];
- if (strtotime($modified_time) + 3600 > time()) {
- header("http/1.1 304");
- exit(0);
- }
- header("last-modified:" . gmdate("d, d m y h:i:s") . "gmt");
- header("expires:" . gmdate("d, d m y h:i:s", time() + 3600) . "gmt");
- header("cache-control: max-age=3600");
特別需要說明一下的是:expires需要服務(wù)器商支持expires模塊默認(rèn)情況下是不會開啟,使用以下命令即可:
- a2enmod expires //啟用expires模塊
- /etc/init.d/apache2 restart //重啟apache服務(wù)
- 我們還可以通過修改http.conf配置中:
- expiresactive on expiresbytype image/gif “access plus 1 month” expiresbytype text/css “now plus 2 day” expiresdefault “now plus 1 day”
以上是針對靜態(tài)內(nèi)容的mime類型來設(shè)置過期時間,因?yàn)槲覀儫o法給靜態(tài)文件直接指定一個絕對到期時間,所以采用”access plus”式的語法,由web服務(wù)器在該內(nèi)容被請求的時候動態(tài)計(jì)算一個絕對到期時間,作為expires標(biāo)記的內(nèi)容.
值得一提的是,對于常見的靜態(tài)文件格式,即便是web服務(wù)器返回http響應(yīng)頭中沒有expires標(biāo)記,瀏覽器也會根據(jù)一些其它線索猜測一個過期時間,比如ie在某種緩存模式下,對于gif圖片設(shè)置為永不過期,除非我們配置expires為馬上過期,也就是將過期時間設(shè)置為當(dāng)前時間或者0.
新聞熱點(diǎn)
疑難解答