詳見: http://www.runoob.com/http/http-messages.html
http消息中請求頭是瀏覽器要告訴服務(wù)器的信息,而響應(yīng)頭是服務(wù)器要告訴客戶端的信息。這些頭的定義是HTTP協(xié)議定義好的,客戶端和服務(wù)器通過解析消息頭中信息來完成各自的工作。比如:請求頭中Accept-Language:zh-CN,zh;q=0.8 告訴服務(wù)器客戶端能接收的語言。

Cache-Control 一個(gè)用于定義緩存指令的通用頭標(biāo)。
緩存策略:
有用的 Cache-Control響應(yīng)頭信息包括:
max-age=[秒] — 執(zhí)行緩存被認(rèn)為是最新的最長時(shí)間。類似于過期時(shí)間,這個(gè)參數(shù)是基于請求時(shí)間的相對時(shí)間間隔,而不是絕對過期時(shí)間,[秒]是一個(gè)數(shù)字,單位是秒:從請求時(shí)間開始到過期時(shí)間之間的秒數(shù)。s-maxage=[秒] — 類似于max-age屬性,除了他應(yīng)用于共享(如:代理服務(wù)器)緩存public — 標(biāo)記認(rèn)證內(nèi)容也可以被緩存,一般來說: 經(jīng)過HTTP認(rèn)證才能訪問的內(nèi)容,輸出是自動(dòng)不可以緩存的;private在服務(wù)器設(shè)置了private比如:Cache-Control:private, max-age=60的情況下,表示只有用戶的瀏覽器可以緩存private響應(yīng),不允許任何中繼Web代理對其進(jìn)行緩存 – 例如,用戶瀏覽器可以緩存包含用戶私人信息的HTML網(wǎng)頁,但是CDN不能緩存。no-cache — 強(qiáng)制每次請求直接發(fā)送給源服務(wù)器,而不經(jīng)過本地緩存版本的校驗(yàn)。這對于需要確認(rèn)認(rèn)證應(yīng)用很有用(可以和public結(jié)合使用),或者嚴(yán)格要求使用最新數(shù)據(jù)的應(yīng)用(不惜犧牲使用緩存的所有好處);no-store — 不做緩存must-revalidate — 告訴緩存必須遵循所有你給予副本的新鮮度。使用緩存的時(shí)候每次必須發(fā)送請求到服務(wù)器校驗(yàn),比如通過If-Modified-Since或If-None-Matchproxy-revalidate — 和 must-revalidate類似,除了他只對緩存代理服務(wù)器起作用,舉例:Cache-Control: max-age=3600, must-revalidate
<?phpheader('Content-type:text/html;charset=utf-8');//用Cache-Control告訴瀏覽器有效期 5秒header('Cache-Control:max-age=5');//等同于Cache-Control:public, max-age=5$curr_time = date('Y-m-d H:i:s');echo '服務(wù)器時(shí)間:'.$curr_time;?><!DOCTYPE html><html><head><meta charset='utf-8'><title>Cache</title></head><body><br> Time:<?php echo $curr_time; ?><br> <a href='cache_sample.php'>刷新時(shí)間</a></body></html>
<?phpheader('Content-type:text/html;charset=utf-8');//用Cache-Control告訴瀏覽器有效期 5秒// header('Cache-Control:max-age=5');//等同于Cache-Control:public, max-age=5//設(shè)置10秒的有效期,時(shí)間格式是GMT//時(shí)間是當(dāng)前服務(wù)器時(shí)間 + 10秒$expires = gmdate('D, d M Y H:i:s', time() + 10) . ' GMT'; header('Expires:$expires');$curr_time = date('Y-m-d H:i:s');echo '服務(wù)器時(shí)間:'.$curr_time;?><!DOCTYPE html><html><head><meta charset='utf-8'><title>Cache</title></head><body><br> Time:<?php echo $curr_time; ?><br> <a href='cache_sample.php'>刷新時(shí)間</a></body></html>
expires的弊端是有效期以服務(wù)器時(shí)間設(shè)置,如果客戶端的時(shí)間和服務(wù)端時(shí)間有一定的時(shí)間差,緩存的控制就有問題了,所以還是建議使用Cache-Control好!
上面的代碼如果同時(shí)設(shè)置了
header('Cache-Control:max-age=5');$expires = gmdate('D, d M Y H:i:s', time() + 10) . ' GMT'; //這個(gè)設(shè)置將無效header('Expires:$expires');Cache-Control(支持) 和 expires 同時(shí)設(shè)置有效期,以 Cache-Control設(shè)置的有效期為準(zhǔn)
(1)響應(yīng)頭包含 Expires, max-age的話,“打開新窗口”、“地址欄輸入url回車”這些瀏覽器行為不會(huì)使瀏覽器在Expires, max-age設(shè)置的有效期時(shí)間內(nèi)去訪問服務(wù)器,而是在緩存中去獲取內(nèi)容,但是”刷新’”或”F5” 例外。
(2)訪問服務(wù)器,根據(jù)服務(wù)器響應(yīng)來獲取內(nèi)容。這種情況發(fā)生在設(shè)置了Cache-Control:no-cache 是否使用緩存必須要通過服務(wù)器驗(yàn)證,或者是設(shè)置了 Expires,max-age但瀏覽器行為是“刷新”或“F5”時(shí)候。’Last-Modified’、’ETag’、’must-revalidate’ 等有些特殊,不直接受瀏覽器行為影響,它們必須訪問服務(wù)器后,再由服務(wù)器判斷是直接發(fā)送新的資源,還是發(fā)送一個(gè)304 Not Modfied讓瀏覽器使用緩存中的資源。
注意: CTRL+ F5是強(qiáng)制刷新。

ETag全稱Entity Tag,用來標(biāo)識(shí)一個(gè)資源。在具體的實(shí)現(xiàn)中,ETag可以是資源的hash值,也可以是一個(gè)內(nèi)部維護(hù)的版本號。但不管怎樣,ETag應(yīng)該能反映出資源內(nèi)容的變化,這是Http緩存可以正常工作的基礎(chǔ)。Last-Modified的原理其實(shí)和ETag差不多,Last-Modified通過時(shí)間來標(biāo)識(shí)資源。通過這樣的方式可以不必每次都獲取全部的資源達(dá)到更新的目的,能極大的節(jié)省服務(wù)器的開銷,更有利于搜素引擎的抓取。
<?phpheader('Content-type:text/html;charset=utf-8');header('Cache-Control:no-cache');//響應(yīng)頭Last-Modified$lastmodified = filemtime('./cache.php');$lastmodifiedGMT = gmdate('D, d M Y H:i:s',$lastmodified). ' GMT';header('Last-Modified:$lastmodifiedGMT');//響應(yīng)頭ETag$etag = md5_file('./cache.php');header('ETag:$etag');if (@$_SERVER['HTTP_IF_MODIFIED_SINCE'] == $lastmodifiedGMT || @trim($_SERVER['HTTP_IF_NONE_MATCH']) == $etag) { header('HTTP/1.1 304 Not Modified'); exit; }//返回304后,下面的內(nèi)容不會(huì)向?yàn)g覽器返回,而瀏覽器會(huì)使用之前的緩存 $curr_time = date('Y-m-d H:i:s');echo '服務(wù)器時(shí)間:'.$curr_time;?><!DOCTYPE html><html><head><meta charset='utf-8'><title>Cache</title></head><body><br> Time:<?php echo $curr_time; ?><br> <a href='cache_sample.php'>刷新時(shí)間</a></body></html>
引用:
[1]寫給后端程序員的HTTP緩存原理介紹
[2]面向站長和網(wǎng)站管理員的Web緩存加速指南[翻譯]
[3]緩存Cache詳解
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選