http緩存機制總結和文章推薦

推薦閱讀:
伯樂在線——HTTP 緩存機制一二三
IMWeb前端博客——HTTP緩存控制小結
IT筆錄——http消息頭html

http緩存機制

關鍵頭部字段
  • cache-control、 Pragma
  • if-Match、if-None-Match
  • if-Modified-Since、if-Unmodified-Since
  • ETag
  • Expires、Last-Modified

Pragma

http1.0可用,如今爲了向下兼容,也設置該頭部,只有一個值:no-cache禁用緩存前端


Expires

設置緩存時間(該時間相對於服務器),接受一個GMT(格林尼治時間),用來告訴瀏覽器過時時間,若是尚未過這個時間則不發送請求。web

Expires: Sun Jul 15 2018 19:13:07 GMT

cache-control

也可用來設置緩存時間,http1.1與http1.0可用,三者優先級:瀏覽器

Pragma > Cache-Control > Expires

可設置多個值,好比經常使用的:no-cache, max-age, public, private緩存


Last-Modified

接受一個格林尼治時間,說明資源的最近一次的修改時間,該字段的做用是當某個資源保存的緩存時間過時了,但服務器並無更新過這個資源,那麼能夠告訴客戶端此資源沒有更新,能夠獲取緩存中的內容(返回304,不返回實體內容)服務器


if-Modified-Since

Last-Modified的值會在下一次的請求中經過if-Modified-Since傳遞給服務器,若是它的值和此時服務器的Last-Modified值一致,說明沒有修改,服務器返回304。若是不一致則看成正常請求處理,返回資源和200狀態碼。併發


ETag

服務端資源有可能被更新了,可是實際內容並無改變。可是這樣依然會引發Last-Modified的更新,服務器給客戶端返回沒有任何改變的內容。爲了解決這個問題,引入了ETag。用於http1.1。
服務器爲資源生成一個惟一的字符串,如經過md5編碼。只要不變,生成的字符串就不變。在客戶端請求資源的時候,將該ETag一塊兒返回給客戶端,客戶端保留該ETag,下次請求的時候帶上。而後比較ETag,相同則表示內容相同,返回304;不一樣,返回資源和200狀態碼。優化


If-None-Match

ETag的值會經過if-None-Match頭部傳遞給服務器,而後服務器比較ETag的值,相同則表示內容相同,返回304;不一樣,返回資源和200狀態碼。編碼


另外的 if-None-Match,if-Unmodified-Since

他們不是用來實現緩存策略的,而是用來優化併發控制,他們的做用是,使得當前請求成爲條件式請求:只有當資源在指定的時間以後沒有進行過修改的狀況下,服務器纔會返回請求的資源,或是接受 POST 或其餘 non-safe 方法的請求。例如在某些場景:假如在原始副本獲取以後,服務器上所存儲的文檔已經被修改,那麼對其做出的編輯會被拒絕提交。code

總結

  1. Expires / Cache-Control用來設置緩存時間,即資源有效時間。狀態碼 200(from cache),可避免請求發送到服務器。
  2. Last-Modified / ETag用來判斷資源是否被修改了。狀態碼 304(not change),可避免傳輸相同的資源內容,形成帶寬和時間的浪費。

使用原則

  • 須要兼容HTTP1.0的時候須要使用Expires,否則能夠考慮直接使用Cache-Control
  • 須要處理一秒內屢次修改的狀況,或者其餘Last-Modified處理不了的狀況,才使用ETag,不然使用Last-- Modified。
  • 對於全部可緩存資源,須要指定一個Expires或Cache-Control,同時指定Last-Modified或者Etag。
  • 能夠經過標識文件版本名、加長緩存時間的方式來減小304響應。
相關文章
相關標籤/搜索