快取控制規定了網站的快取行為,讓瀏覽器知道多久重新整理一次本機儲存的資源。
閱讀本文後,您將能夠:
相關內容
訂閱 TheNET,這是 Cloudflare 每月對網際網路上最流行見解的總結!
複製文章連結
快取控制是支配瀏覽器快取行為的 HTTP 標頭。簡單來說,當有人造訪網站時,他們的瀏覽器會將某些資源(例如影像和網站資料)儲存在稱為快取的存放區中。當該使用者重新造訪同一網站時,快取控制會設定規則,以確定該使用者是將從其本機快取中載入這些資源,還是瀏覽器必須向伺服器傳送請求以獲取新資源。為了更深入地瞭解快取控制,需要對瀏覽器快取和 HTTP 標頭有基本的瞭解。
如上所述,瀏覽器快取是指 Web 瀏覽器儲存網站資源以便無需再次從伺服器擷取該資源的情況。例如,網站上的背景影像可能本機儲存在快取中,當使用者第二次造訪該頁面時,影像將從使用者的本機檔案載入,且頁面載入速度會快得多。
瀏覽器只會將這些資源儲存一段指定的時間,稱為存留時間 (TTL)。如果使用者在 TTL 過期后請求快取的資源,則瀏覽器將不得不再次聯繫伺服器並下載資源的新複本。瀏覽器和 Web 伺服器如何知道每個資源的 TTL?這就是 HTTP 標頭發揮作用的地方。
超文字傳輸通訊協定 (HTTP) 概述了全球資訊網上通訊的語法,此通訊包括從用戶端到伺服器的請求以及從伺服器返回到用戶端的回應。這些 HTTP 請求和回應都帶有一系列稱為標頭的索引鍵/值組。
這些標頭包含有關每個通訊的許多重要資訊。例如,請求標頭通常包含:
回應標頭通常包含以下資訊:
快取控制標頭可以同時出現在 HTTP 請求和回應中。
標頭包含一個由冒號分隔的索引鍵/值組。對於快取控制,「索引鍵」,或者說冒號左側的部分,始終是「快取控制」。「值」是冒號右側的值,可以有一個或多個逗號分隔的值用於快取控制。
這些值稱為指令,它們指示誰可以快取資源,以及在必須更新這些資源之前資源可以快取的時間。下面我們將介紹一些最常見的快取控制指令:
具有「private」指令的回應只能由用戶端快取,而不能由中繼代理程式(如 CDN 或代理)快取。這些通常是包含私人資料的資源,例如顯示使用者個人資訊的網站。
相反,「public」指令意味著資源可以由任何快取儲存。
帶有「no-store」指令的回應無法在任何地方快取。這意味著每次使用者請求此資料時,都必須向原始伺服器傳送請求以獲取新複本。此指令通常保留用於包含極其敏感資料(如銀行帳戶資訊)的資源。
此指令意味著如果不先檢查是否有更新的版本,就無法使用所請求資源的快取版本。這通常使用 ETag 完成。
ETag 是另一個 HTTP 標頭,其中包含請求資源時專屬於資源版本的權杖。每當更新資源時,原始伺服器上的此權杖都會變更。
當使用者返回到具有「no-cache」資源的頁面時,用戶端將始終必須連接到原始伺服器,並將快取資源上的 ETag 與伺服器上的 ETag 進行比較。如果 ETag 相同,則會向使用者提供快取的資源。如果不相同,這意味著資源已更新,用戶端需要下載新版本以提供給使用者。此過程可確保使用者始終獲得該資源的最新版本,而又不需要進行不必要的下載。
此指令規定了存留時間,換句話說,在下載資源后可以從快取中提供該資源的秒數。例如,如果「最大壽命」設定為 1800,這意味著在首次從伺服器請求資源後的 1,800 秒(30 分鐘)內,將在後續請求中向使用者提供該資源的快取版本。如果使用者在 30 分鐘後再次請求資源,則用戶端必須從原始伺服器請求新複本。
「s-maxage」指令專門用於共用快取(如 CDN),它規定了這些共用快取可以從快取中持續提供資源的時間。此指令將覆寫單個用戶端的「max-age」指令。
瀏覽器快取是保護資源和改善網際網路上使用者體驗的好方法,但如果沒有快取控制,它將非常脆弱。每個網站上的每個資源都將受相同的快取規則的約束,這意味著敏感性資訊將以與公共資訊相同的方式進行快取,且經常更新的資源與很少變更的資源將快取相同的時間量。
快取控制增加了靈活性,使瀏覽器快取真正有用,讓開發人員可以決定如何快取每個資源。它還允許開發人員為中繼設定特殊規則,這也是使用 CDN(如 Cloudflare CDN)的網站往往比不使用 CDN 的網站表現更好的原因之一。