http快取梳理
借鑑並且摘抄了這篇部落格的部分內容
http快取詳解,http快取推薦方案
http請求和響應頭的快取欄位
1. Cache-control
快取控制頭,http快取控制的最高指令
no-store:所有內容都不快取
no-cache:快取,但是瀏覽器使用快取前,都會請求瀏覽器判斷快取資源是否是最新
max-age=x:請求快取後的X秒不再發起請求,屬於http 1.1的屬性,與 Expire(http 1.0) 類似,但是優先順序比 Expires 。這是一個相對時間,expire是絕對時間。max-age=0等同於no-cache
s-maxage=x:代理伺服器請求源站快取X秒後不再發起請求,只對CDN快取有效
public:客戶端和代理伺服器都可快取
private:只有客戶端可以快取
2.Expires
響應頭,代表資源過期時間,由伺服器返回提供,GMT格式日期,是http1.0的屬性,在與max-age(http1.1)共存的情況下,優先順序要低。
3.Last-Modified 和 if-Modified-Since
Last-Modified 是響應頭,資源最新修改時間,由伺服器告訴瀏覽器。就是該檔案在檔案系統中的最近修改時間。
if-Modified-Since 是請求頭,資源最新修改時間,由瀏覽器告訴伺服器,把伺服器給的 Last-Modified 請求又還給伺服器對比
5.Etag 和 if-None-Match,優先順序比上述兩項高
Etag 是響應頭,資源標識,由伺服器告訴瀏覽器。
if-None-Match 是請求頭,快取資源標識,由瀏覽器告訴伺服器,就是伺服器給的Etag,伺服器進行對比。
7.Pragma
是一個在 HTTP/1.0 中規定的通用首部,這個首部的效果依賴於不同的實現,所以在“請求-響應”鏈中可能會有不同的效果。它用來向後相容只支援 HTTP/1.0 協議的快取伺服器,那時候 HTTP/1.1 協議中的 Cache-Control 還沒有出來。
看一張圖片的載入請求。
首次載入,瀏覽器預設 cache-control: no-cache
。伺服器返回cache-control:public, max-age=0
Last-Modified: Mon, 07 Dec 2020 14:38:48 GMT
ETag: "P9fD9DvFuQoSGBR4aLWx+w=="
,告訴瀏覽器快取策略為no-cache,並且返回資源的修改時間和e-tag。用於下次請求的時候,將這兩項資訊返回給伺服器用於判斷前端的快取檔案是否最新。
GET /public/img.jpeg HTTP/1.1
Host: 127.0.0.1:7001
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Referer: http://127.0.0.1:7001/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: _editor=markdown; csrfToken=E9TaTfCpenoCXMfMDi-a0qJU
HTTP/1.1 200 OK
Accept-Ranges: bytes
Last-Modified: Mon, 07 Dec 2020 14:38:48 GMT
ETag: "P9fD9DvFuQoSGBR4aLWx+w=="
content-type: image/jpeg
content-length: 61672
cache-control: public, max-age=0
content-md5: P9fD9DvFuQoSGBR4aLWx+w==
x-readtime: 1
keep-alive: timeout=5
Date: Thu, 10 Dec 2020 16:33:54 GMT
Connection: keep-alive
第二次請求,瀏覽器將之前伺服器給的 last=modified 和 e-tag提交給伺服器,也就是請求頭裡的 if-modified-since 和 if-none-match 。伺服器判斷檔案沒有修改,返回304。瀏覽器使用快取檔案。
GET /public/img.jpeg HTTP/1.1
Host: 127.0.0.1:7001
Connection: keep-alive
If-None-Match: "P9fD9DvFuQoSGBR4aLWx+w=="
If-Modified-Since: Mon, 07 Dec 2020 14:38:48 GMT
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Referer: http://127.0.0.1:7001/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: _editor=markdown; csrfToken=E9TaTfCpenoCXMfMDi-a0qJU
HTTP/1.1 304 Not Modified
Accept-Ranges: bytes
Last-Modified: Mon, 07 Dec 2020 14:38:48 GMT
ETag: "P9fD9DvFuQoSGBR4aLWx+w=="
x-readtime: 0
keep-alive: timeout=5
Date: Thu, 10 Dec 2020 16:32:08 GMT
Connection: keep-alive
F5 和 CTRL+F5 的區別
1.瀏覽器位址列回車,或者點選跳轉按鈕,前進,後退,新開視窗,這些行為,會讓Expires,max-age生效,也就是說,這幾種操作下,瀏覽器會判斷過期時間,再考慮要不要發起請求,當然Last-Modified和Etag也有效。
2.F5重新整理瀏覽器,或者使用瀏覽器導航欄的重新整理按鈕,這幾種,會忽略掉Expires,max-age的限制,強行發起請求,Last-Modified和Etag在這種情況下也有效。
3**.CTRL+F5**是強制請求,所有快取檔案都不使用,全部重新請求下載,因此Expires,max-age,Last-Modified和Etag全部失效。
相關文章
- HTTP快取HTTP快取
- ServiceWorker 快取與 HTTP 快取快取HTTP
- HTTP快取——協商快取(快取驗證)HTTP快取
- Web快取 – HTTP協議快取Web快取HTTP協議
- 初探Http快取?HTTP快取
- HTTP - 快取策略HTTP快取
- 前端 http 快取前端HTTP快取
- http快取與cdn快取配置指南HTTP快取
- 淺聊HTTP快取 (HTTP Cache)HTTP快取
- HTTP----HTTP快取機制HTTP快取
- HTTP快取機制HTTP快取
- 淺談HTTP快取HTTP快取
- 圖解HTTP快取圖解HTTP快取
- http快取知識HTTP快取
- HTTP深入之快取HTTP快取
- HTTP 快取驗證HTTP快取
- 圖解 HTTP 快取圖解HTTP快取
- 快取專題:HTML5離線快取與HTTP快取快取HTMLHTTP
- http快取策略以及強快取和協商快取淺析HTTP快取
- 從HTTP到WEB快取HTTPWeb快取
- HTTP快取筆記(1)HTTP快取筆記
- HTTP三種快取方式HTTP快取
- HTTP 快取中的 VaryHTTP快取
- 面試常客:HTTP 快取面試HTTP快取
- 深入解析 HTTP 快取控制HTTP快取
- http系列--徹底理解瀏覽器的快取機制(http快取機制)HTTP瀏覽器快取
- 淺談HTTP快取與CDN快取的那點事HTTP快取
- HTTP快取機制及原理HTTP快取
- HTTP 快取的那些事兒HTTP快取
- rfc7234之http快取HTTP快取
- Cookie && Session && localStorage && sessionstorage && HTTP快取CookieSessionHTTP快取
- http快取機制及其原理HTTP快取
- 通過HTTP Header控制快取HTTPHeader快取
- HTTP快取協議實戰HTTP快取協議
- 輕鬆理解HTTP快取策略HTTP快取
- http強制快取、協商快取、指紋ETag詳解HTTP快取
- 圖解 HTTP 的快取機制 | 實用 HTTP圖解HTTP快取
- [前端 · 面試 ]HTTP 總結(七)—— HTTP 快取概述前端面試HTTP快取