1. 程式人生 > >HTTP 緩存

HTTP 緩存

圖片 enc one 特定 span ann 身份驗證 http響應 tro

緩存:存儲指定資源的一份拷貝,並在下次請求該資源時提供該拷貝。

緩存需要合理配置,因為並不是所有資源都是永久不變的:重要的是對一個資源的緩存應截止到其下一次發生改變(即不能緩存過期的資源)。

緩存的種類有很多,其大致可歸為兩類:私有與共享緩存。

私有服務器緩存

只能用於單獨用戶。

比如瀏覽器設置中的“緩存”選項:瀏覽器緩存擁有用戶通過 HTTP 下載的所有文檔。

這些緩存為瀏覽過的文檔提供向後/向前導航,保存網頁,查看源碼、緩存內容的離線瀏覽等功能,可以避免再次向服務器發起多余的請求。

共享代理緩存

共享緩存可以被多個用戶使用。例如,ISP 或你所在的公司可能會架設一個 web 代理來作為本地網絡基礎的一部分提供給用戶。這樣熱門的資源就會被重復使用,減少網絡擁堵與延遲。

緩存控制

1. Cache-control

Cache-Control: private 響應的內容只能被唯一的用戶緩存,不可以被共享緩存存儲。隱私模式下的瀏覽器會通過這種方式存儲緩存。
Cache-Control: public 針對需要進行http身份驗證的頁面或者一些不能被順利緩存的響應碼,通過定義public以支持緩存
Cache-Control: no-cache 不緩存內容
Cache-Control: no-store
Cache-Control: no-cache, no-store, must-revalidate  緩存中不得存儲任何關於客戶端請求和服務端響應的內容。每次由客戶端發起的請求都會下載完整的響應內容。must-revalidate:  在使用一些老的資源前強制驗證狀態判斷其是否過期。
Cache-Control: max-age=31536000  max-age是距離請求發起的時間的秒數。判斷緩存是否過期。針對圖片、css、js等靜態資源。

為什麽定期或者頻繁更新的資源要設置一個相對長一些的過期時間?
不頻繁更新的文件會使用特定的命名方式:在URL後面(通常是文件名後面)會加上版本號。這麽做也存在一個弊端,所有引用這個資源的地方都需要更新鏈接。
web開發者們通常會采用自動化構建工具在實際工作中完成這些瑣碎的工作。當低頻更新的資源(js/css)變動了,只用在高頻變動的資源文件(html)裏做入口的改動。

緩存驗證

1. ETag : 資源的特定版本的標識符

緩存的強校驗器。如果資源請求的響應頭裏含有ETag, 客戶端可以在後續的所有請求的頭中帶上 If-None-Match

頭來驗證緩存。

如果內容沒有改變,Web服務器不需要發送完整的響應。如果內容發生了變化,使用ETag有助於防止資源的同時更新相互覆蓋(“空中碰撞”)。

2. Last-Modified

一次性的弱校驗器。如果響應頭裏含有這個信息,客戶端可以在後續的一次請求中帶上 If-Modified-Since 來驗證緩存。

3. Vary HTTP 響應頭決定了對於後續的請求頭,如何判斷是請求一個新的資源還是使用緩存的文件。

只有當前的請求和原始(緩存)的請求頭跟緩存的響應頭裏的Vary都匹配,才能使用緩存的響應。

Vary: User-Agent 通過UA判斷是否使用緩存的頁面。移動版和桌面的客戶端的請求頭中的User-Agent不同,避免在不同的終端展示錯誤的布局。
Vary: User-Agent, Accept-Encoding 服務器應以 User-Agent 和 Accept-Encoding 兩個請求首部字段來區分緩存版本。
 
 

HTTP 緩存