緩存分好多種:服務器緩存,第三方緩存,瀏覽器緩存等。其中瀏覽器緩存是代價最小的,由於瀏覽器緩存依賴的是客戶端,而幾乎不耗費服務器端的資源。瀏覽器作緩存須要給瀏覽器發送指定的Http頭,告訴瀏覽器緩存多長時間,或者堅定不要緩存。windows
1.Expires: +過時時間數組
表示在指定時間後瀏覽器緩存失效瀏覽器
這裏的過時時間必須是http格式的日期時間, 其餘都會被解析成當前時間"以前", 緩存會立刻過時. http的日期時間必須是格林威治時間(GMT), 而不是本地時間緩存
e.g. Fri, 30 Oct 2009 13:13:13服務器
使用Expires過時必需要求服務器的時間是正確的,不然發送的http頭就會出問題, 在windows服務下能夠設置時間服務器來同步時間網站
2.Cache-control: 緩存控制url
控制緩存值分爲: 代理
max-age=[秒]: 執行緩存被認爲是最新的最長時間. 相似於過時時間, 這個參數是基於請求時間的相對時間間隔, 而不是絕對過時時間, [秒]是一個數組, 單位是秒: 從請求時間到過時時間之間的秒數圖片
s-maxage=[秒]: 相似於max-age屬性, 除了他應用於共享(如: 代理服務器)換粗資源
public: 僅體如今響應頭. 通知瀏覽器能夠無條件地緩存該響應. 標記認證內容也能夠被緩存. 通常來講, 通過http認證才能訪問的內容, 輸出是自動不能夠緩存的
private: 僅體如今響應頭, 通知瀏覽器只針對單個用戶緩存響應, 且能夠具體指定某個字段, 如private-"username"
no-cache: 強制每次請求之間發送給源服務器, 而不通過本地緩存版本的校驗. 這對於須要確認認證應用頗有用(能夠和public結合使用), 或者嚴格要求使用最新數據的應用(不惜犧牲使用緩存的全部好處)
請求頭中: 告訴瀏覽器回去服務器取數據, 並驗證你的緩存(若是有的話)
響應頭中: 告訴瀏覽器, 必定要回服務器校驗, 無論有沒有緩存數據. 若是肯定沒有修改, 可使用緩存中的數據
no-store: 告訴瀏覽器任何狀況下都不要被緩存
must-revalidate: 告訴瀏覽器必須遵循全部你給予副本的新鮮度的, http容許緩存在某些特定狀況下返回過時數據, 指定了這個屬性, 你告訴緩存, 你但願嚴格的遵循你的規則proxy-revalidate: 和must0revalidate相似, 除了他只對緩存代理服務器起做用
e.g. Cache-Control: max-age=3600, must-revalidate。
3. Last-Modified/If-Modified-Since
這兩個Http頭是一對,表示某個地址的最近更新時間端有一個最後更改時間爲何時間的緩存,Last-Modified 是服務器發送給客戶端。If-Modified-Since是客戶端發送給服務器。服務器端接收到If-Modified-Since後則判斷客戶端緩存的這份url地址的緩存是不是最新的,若是是最新的則服務器端直接給客戶端返回HttpStatus 304,意思是說這個內容在你上次請求以後沒有變化過,你直接用緩存就能夠了;若是服務器發現url的最後更新時間比If-Modified-Since的值要新,則會輸出新的內容。
4. ETag/If-None-Match
ETag和Last-Modified相似,不過他發送的是一個字符串來標示url的版本,若是url變了則此標示也跟着變化,在瀏覽器發送If-None-Match時告訴瀏覽器內容已經變了,或者沒變可使用緩存。
list會自動給靜態文件加上Etag,在文件發生改變時從新生成一個Etag,這樣對於一個網站中的n多個靜態文件如:樣式表,小圖片等,客戶端只下載一次就夠了,能夠減輕負載。
5.Pragma: no-cache
是http1.0中的常規頭, 做用同http1.1的Cache-Control: no-cache
關於以上緩存機制的優先級:
Cache-Control > Expires : 前者設置更詳細
Cache-Control/Expires > Last-Modified/ETag : 本地副本根據Cache-Control/Expires還在有效期內, 則不會在此發送請求去服務器詢問修改時間或實體標識了 即最前面的最重要, 前面的生效後, 後面進本就失效。
徹底匹配If-Modified-Since和If-None-Match即檢查完修改時間和ETag後, 服務器才能返回304;