200 OK (from cache) 與 304 Not Modified


本文載於袁源(歪歪)的個人博客:http://www.bokeyy.com/post/200-ok-from-cache-vs-304-not-modified.html 。

為什么有的緩存是 200 OK (from cache),有的緩存是 304 Not Modified 呢?很簡單,看運維是否移除了 Entity Tag。移除了,就總是 200 OK (from cache)。沒有移除,就兩者交替出現。

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

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

它們都是在設置了緩存的情況下觸發的。

那么,兩者觸發的時機有什么區別呢?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 還真不少呢!

本文並不是說影響瀏覽器緩存只有 ETag 這一個因素的意思,請大家不要誤解。只是就“為什么我加了緩存,有的卻是 304 Not Modified, 而不是 200 OK(from cache)”這件事給出一個一針見血的原因和解答。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM