[web] 200 OK (from cache) 與 304 Not Modified

爲何有的緩存是 200 OK (from cache),有的緩存是 304 Not Modified 呢?很簡單,看運維是否移除了 Entity Tag。移除了,就老是 200 OK (from cache)。沒有移除,就二者交替出現。html

最近在作百度雲觀測的 nginx 配置優化。從知乎上看到這個問題:「阿里雲存儲如何讓瀏覽器始終以200 (from cache)緩存圖片?」,提問者強調 200 OK (from cache) 和 304 Not Modified 的區別,有感而發。nginx

其實, 200 OK (from cache)  是瀏覽器沒有跟服務器確認,直接用了瀏覽器緩存;而 304 Not Modified 是瀏覽器和服務器多確認了一次緩存有效性,再用的緩存。web

它們都是在設置了緩存的狀況下觸發的。瀏覽器

那麼,二者觸發的時機有什麼區別呢?200 OK (from cache) 是直接點擊連接訪問,輸入網址按回車訪問也能觸發;而 304 Not Modified 是刷新頁面時觸發,或是設置了長緩存、但 Entity Tags 沒有移除時觸發。這是通過查閱資料得出的結論。博主實際測試了一下,結論與之相符:緩存

直接訪問有緩存的網站都觸發 200 OK (from cache)圖1 – 直接訪問有緩存的網站都觸發 200 OK (from cache)刷新瀏覽器會觸發 304 Not Modified圖2 – 刷新瀏覽器則會觸發 304 Not Modified同一域名下,沒有 Entity Tag 的資源直接訪問,是 200 OK (from cache) 的結果圖3 – 同一域名下,沒有 Entity Tag 的資源直接訪問,是 200 OK (from cache) 的結果同一域名下,有 Entity Tag ,直接訪問就會觸發 304 Not Modified圖4 – 同一域名下,有 Entity Tag ,直接訪問就會觸發 304 Not Modified安全

如今通常都會設置長時間的緩存,正確設置方式參考這兩篇筆記:服務器

參考文獻

後記

搜索了一下,發現這個問題,在網絡上並尚未定論,也沒發現有人去實測。網絡

想一想也對,如今網絡那麼快,304 Not Modified 仍是 200 OK (from cache),若是不是較真地追求速度,可能你們都以爲區別不大,從而也就沒發現這個問題了。運維

博主截圖的域名是某著名 IT 公司的 CDN(已反饋)。可見犯這個錯誤的運維 GG 還真很多呢!post

本文並非說影響瀏覽器緩存只有 ETag 這一個因素的意思,請你們不要誤解。只是就「爲何我加了緩存,有的倒是 304 Not Modified, 而不是 200 OK(from cache)」這件事給出一個一針見血的緣由和解答。本文也發在了 div.io 上,詳細的 ETag 補充知識能夠看 @hefangshi 補充的評論

 

轉自:

200 OK (from cache) 與 304 Not Modified

相關文章
相關標籤/搜索