詳見: http://www.runoob.com/http/http-messages.html
http消息中請求頭是瀏覽器要告訴服務器的信息,而響應頭是服務器要告訴客戶端的信息。這些頭的定義是HTTP協(xié)議定義好的,客戶端和服務器通過解析消息頭中信息來完成各自的工作。比如:請求頭中Accept-Language:zh-CN,zh;q=0.8 告訴服務器客戶端能接收的語言。
Cache-Control 一個用于定義緩存指令的通用頭標。
緩存策略:
有用的 Cache-Control響應頭信息包括:
max-age=[秒] — 執(zhí)行緩存被認為是最新的最長時間。類似于過期時間,這個參數(shù)是基于請求時間的相對時間間隔,而不是絕對過期時間,[秒]是一個數(shù)字,單位是秒:從請求時間開始到過期時間之間的秒數(shù)。s-maxage=[秒] — 類似于max-age屬性,除了他應用于共享(如:代理服務器)緩存public — 標記認證內(nèi)容也可以被緩存,一般來說: 經(jīng)過HTTP認證才能訪問的內(nèi)容,輸出是自動不可以緩存的;private在服務器設(shè)置了private比如:Cache-Control:private, max-age=60的情況下,表示只有用戶的瀏覽器可以緩存private響應,不允許任何中繼Web代理對其進行緩存 – 例如,用戶瀏覽器可以緩存包含用戶私人信息的HTML網(wǎng)頁,但是CDN不能緩存。no-cache — 強制每次請求直接發(fā)送給源服務器,而不經(jīng)過本地緩存版本的校驗。這對于需要確認認證應用很有用(可以和public結(jié)合使用),或者嚴格要求使用最新數(shù)據(jù)的應用(不惜犧牲使用緩存的所有好處);no-store — 不做緩存must-revalidate — 告訴緩存必須遵循所有你給予副本的新鮮度。使用緩存的時候每次必須發(fā)送請求到服務器校驗,比如通過If-Modified-Since或If-None-Matchproxy-revalidate — 和 must-revalidate類似,除了他只對緩存代理服務器起作用,舉例: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 '服務器時間:'.$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'>刷新時間</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秒的有效期,時間格式是GMT//時間是當前服務器時間 + 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 '服務器時間:'.$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'>刷新時間</a></body></html>
expires的弊端是有效期以服務器時間設(shè)置,如果客戶端的時間和服務端時間有一定的時間差,緩存的控制就有問題了,所以還是建議使用Cache-Control好!
上面的代碼如果同時設(shè)置了
header('Cache-Control:max-age=5');$expires = gmdate('D, d M Y H:i:s', time() + 10) . ' GMT'; //這個設(shè)置將無效header('Expires:$expires');
Cache-Control(支持) 和 expires 同時設(shè)置有效期,以 Cache-Control設(shè)置的有效期為準
(1)響應頭包含 Expires, max-age的話,“打開新窗口”、“地址欄輸入url回車”這些瀏覽器行為不會使瀏覽器在Expires, max-age設(shè)置的有效期時間內(nèi)去訪問服務器,而是在緩存中去獲取內(nèi)容,但是”刷新’”或”F5” 例外。
(2)訪問服務器,根據(jù)服務器響應來獲取內(nèi)容。這種情況發(fā)生在設(shè)置了Cache-Control:no-cache 是否使用緩存必須要通過服務器驗證,或者是設(shè)置了 Expires,max-age但瀏覽器行為是“刷新”或“F5”時候。’Last-Modified’、’ETag’、’must-revalidate’ 等有些特殊,不直接受瀏覽器行為影響,它們必須訪問服務器后,再由服務器判斷是直接發(fā)送新的資源,還是發(fā)送一個304 Not Modfied讓瀏覽器使用緩存中的資源。
注意: CTRL+ F5是強制刷新。
ETag全稱Entity Tag,用來標識一個資源。在具體的實現(xiàn)中,ETag可以是資源的hash值,也可以是一個內(nèi)部維護的版本號。但不管怎樣,ETag應該能反映出資源內(nèi)容的變化,這是Http緩存可以正常工作的基礎(chǔ)。Last-Modified的原理其實和ETag差不多,Last-Modified通過時間來標識資源。通過這樣的方式可以不必每次都獲取全部的資源達到更新的目的,能極大的節(jié)省服務器的開銷,更有利于搜素引擎的抓取。
<?phpheader('Content-type:text/html;charset=utf-8');header('Cache-Control:no-cache');//響應頭Last-Modified$lastmodified = filemtime('./cache.php');$lastmodifiedGMT = gmdate('D, d M Y H:i:s',$lastmodified). ' GMT';header('Last-Modified:$lastmodifiedGMT');//響應頭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)容不會向瀏覽器返回,而瀏覽器會使用之前的緩存 $curr_time = date('Y-m-d H:i:s');echo '服務器時間:'.$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'>刷新時間</a></body></html>
引用:
[1]寫給后端程序員的HTTP緩存原理介紹
[2]面向站長和網(wǎng)站管理員的Web緩存加速指南[翻譯]
[3]緩存Cache詳解
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。
新聞熱點
疑難解答
圖片精選