推薦閱讀:
伯樂在線——HTTP 緩存機制一二三
IMWeb前端博客——HTTP緩存控制小結
IT筆錄——http消息頭html
關鍵頭部字段
http1.0可用,如今爲了向下兼容,也設置該頭部,只有一個值:no-cache禁用緩存前端
設置緩存時間(該時間相對於服務器),接受一個GMT(格林尼治時間),用來告訴瀏覽器過時時間,若是尚未過這個時間則不發送請求。web
Expires: Sun Jul 15 2018 19:13:07 GMT
也可用來設置緩存時間,http1.1與http1.0可用,三者優先級:瀏覽器
Pragma > Cache-Control > Expires
可設置多個值,好比經常使用的:no-cache, max-age, public, private緩存
接受一個格林尼治時間,說明資源的最近一次的修改時間,該字段的做用是當某個資源保存的緩存時間過時了,但服務器並無更新過這個資源,那麼能夠告訴客戶端此資源沒有更新,能夠獲取緩存中的內容(返回304,不返回實體內容)服務器
Last-Modified的值會在下一次的請求中經過if-Modified-Since傳遞給服務器,若是它的值和此時服務器的Last-Modified值一致,說明沒有修改,服務器返回304。若是不一致則看成正常請求處理,返回資源和200狀態碼。併發
服務端資源有可能被更新了,可是實際內容並無改變。可是這樣依然會引發Last-Modified的更新,服務器給客戶端返回沒有任何改變的內容。爲了解決這個問題,引入了ETag。用於http1.1。
服務器爲資源生成一個惟一的字符串,如經過md5編碼。只要不變,生成的字符串就不變。在客戶端請求資源的時候,將該ETag一塊兒返回給客戶端,客戶端保留該ETag,下次請求的時候帶上。而後比較ETag,相同則表示內容相同,返回304;不一樣,返回資源和200狀態碼。優化
ETag的值會經過if-None-Match頭部傳遞給服務器,而後服務器比較ETag的值,相同則表示內容相同,返回304;不一樣,返回資源和200狀態碼。編碼
他們不是用來實現緩存策略的,而是用來優化併發控制,他們的做用是,使得當前請求成爲條件式請求:只有當資源在指定的時間以後沒有進行過修改的狀況下,服務器纔會返回請求的資源,或是接受 POST 或其餘 non-safe 方法的請求。例如在某些場景:假如在原始副本獲取以後,服務器上所存儲的文檔已經被修改,那麼對其做出的編輯會被拒絕提交。code