對於http快取,之前一直只知道根據 瀏覽器是否向服務端發請求來確認是否使用快取資源緩,瀏覽器快取分 強制快取 和 協商快取 ,分別使用的字段前者是expires和cach-control,後者是 etag 和 last-modified ,但對於整個瀏覽器快取過程是怎麼樣的 比較模糊,看了一些部落格文章,和看書後算是弄懂了,精煉後總結如下:
記錄下來,方面以後回顧
注:快取一定是之前已經有請求過資源的了,否則何來 「快取」 一說注:http 快取只能快取 get 方式請求的資源http快取:瀏覽器向伺服器請求資源時,會先到達瀏覽器快取,當快取中有想要請求的資源的副本的話,就直接使用快取裡的資源,而是向原始伺服器來讀取這個資源
瀏覽器在發起請求資源前,會根據請求頭欄位expires和cach-control
判斷是否命中強快取,如果命中的話就直接讀取本地快取資源,不會向伺服器發請求,且返回的狀態碼是200
如果沒有命中強快取,則瀏覽器會發起請求,會帶一些請求頭欄位,服務端根據這些欄位來判斷是否命中協商快取。 比如 if-none-match
和 if-modified-since,這是瀏覽器發給服務端的請求頭欄位。
if-none-match
的值:上次請求服務端返回資源的響應頭字段裡的etag
的值, etag: 服務端根據 資源檔案
生成的唯一標識; 只要資源檔案沒變化則 etag 值不變if-modified-since
的值: 上次服務端返回的last-modified
的值, last-modified : 響應資源在服務端最後修改的日期
然後服務端會判斷這次請求欄位的if-none-match和根據它請求的資源檔案生產的 etag 的值,看二者是不是相同,
或者判斷
請求欄位的if-modified-since和 服務端該資源的最後修改時間做物件,看二者是否相同。
相同的話說明資源沒有改變過,則不會返回資源檔案,而是返回304 ,表示協商快取, 告訴瀏覽器直接讀取它本地的快取資源
如果不同的話
說明資源已經變化了,則會返回請求的資源檔案,和狀態碼200 ,協商快取失效
expires:
設的是資源的過期時間,瀏覽器判斷這次請求的時候是不是超過這個日期
沒超的話就直接讀取快取中的資源,不向伺服器發請求
cach-control:
快取控制 有幾個值
html 頁面
在標籤 裡加入
標籤,並加入相關引數(比如expires, cache-control)的設定(通過
http-equiv
和content
)
栗子:
靜態資源(比如css檔案,等)
靜態資源的快取的設定一般都是在 web伺服器上(nginx,apache)進行的
由於協商快取還是需要和伺服器互動,所以
盡量使用強制快取,而不使用協商快取
App PHP快取抓取http快取
解決方案方案分為兩部分 業務線中讀取php快取,寫入redis 在指令碼中,取出redis快取 寫入log檔案 如下。var繼承的子類如有構造方法 記得呼叫父類方法 驗證登入 public function construct 記錄日誌 public function destruct page層使...
前端快取之HTTP快取
說真的,當自己還很小白的時候,明明修改了js的內容了,但是就是沒有載入成功,那時候感覺好神奇,好沒道理。後來知道了這是因為快取的原因。說實話,現在基於各種框架的開發,基本上沒有在業務 過程中關注快取的事情了,當然,不包括使用localstorage和cookie。今天自己學習了一些關於前端快取的東西...
前端快取總結 HTTP快取
在前端面試中,可能或多或少都會被提及快取問題,而這個問題大多數都是作為業務中不得不考慮的乙個效能優化點,如果平時沒有怎麼關注或是特意去了解這塊的童鞋們,可能就是不太了解其中的原由,那麼今天我們就這個快取問題來細細分析,幫助一些還不是太明白的或是剛入門的前端童鞋們梳理梳理,理解理解,那就話不多說,開始...