1. 程式人生 > 其它 >瀏覽器的 強制快取 協商快取

瀏覽器的 強制快取 協商快取

強制快取 1、Expires HTTP/1.0 中可以使用響應頭部欄位 Expires 來設定快取時間,它對應一個未來的時間戳。客戶端第一次請求時,服務端會在響應頭部新增 Expires 欄位。當瀏覽器再次傳送請求時,先會對比當前時間和 Expires 對應的時間,如果當前時間早於 Expires 時間,那麼直接使用快取;反之,需要再次傳送請求。 服務端和瀏覽器的時間很可能不同,因此這個快取過期時間容易出現偏差。同樣的,客戶端也可以通過修改系統時間來繼續使用快取或提前讓快取失效。 2、Cache-Control 它的常用值有下面幾個: no-cache,表示使用協商快取,即每次使用快取前必須向服務端確認快取資源是否更新; no-store,禁止瀏覽器以及所有中間快取儲存響應內容; public,公有快取,表示可以被代理伺服器快取,可以被多個使用者共享; private,私有快取,不能被代理伺服器快取,不可以被多個使用者共享; max-age,以秒為單位的數值,表示快取的有效時間; must-revalidate,當快取過期時,需要去服務端校驗快取的有效性。 注:cache-control 的 max-age 優先順序高於 Expires 3、<metahttp-equiv="expires"content="Wed,20Jun202122:33:00GMT"/> 但在 HTML5 規範中,並不支援這種方式,所以儘量不要使用 meta 標籤來設定快取.
協商快取
協商快取的更新策略是不再指定快取的有效時間了,而是瀏覽器直接傳送請求到服務端進行確認快取是否更新,如果請求響應返回的 HTTP 狀態為 304,則表示快取仍然有效。控制快取的難題就是從瀏覽器端轉移到了服務端。 1、Last-Modified 和 If-Modified-Since 工作流程如下: 瀏覽器第一次請求資源,服務端在返回資源的響應頭中加入 Last-Modified 欄位,該欄位表示這個資源在服務端上的最近修改時間; 當瀏覽器再次向服務端請求該資源時,請求頭部帶上之前服務端返回的修改時間,這個請求頭叫 If-Modified-Since; 服務端再次收到請求,根據請求頭 If-Modified-Since 的值,判斷相關資源是否有變化,如果沒有,則返回 304 Not Modified,並且不返回資源內容,瀏覽器使用資源快取值;否則正常返回資源內容,且更新 Last-Modified 響應頭內容。 2、 ETag 和 If-None-Match 具體工作流程如下: 瀏覽器第一次請求資源,服務端在返響應頭中加入 Etag 欄位,Etag 欄位值為該資源的雜湊值; 當瀏覽器再次跟服務端請求這個資源時,在請求頭上加上 If-None-Match,值為之前響應頭部欄位 ETag 的值; 服務端再次收到請求,將請求頭 If-None-Match 欄位的值和響應資源的雜湊值進行比對,如果兩個值相同,則說明資源沒有變化,返回 304 Not Modified;否則就正常返回資源內容,無論是否發生變化,都會將計算出的雜湊值放入響應頭部的 ETag 欄位中。