本文載於袁源(歪歪)的個人博客: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 沒有移除時觸發。這是經過查閱資料得出的結論。博主實際測試了一下,結論與之相符:
圖1 – 直接訪問有緩存的網站都觸發 200 OK (from cache)
圖2 – 刷新瀏覽器則會觸發 304 Not Modified
圖3 – 同一域名下,沒有 Entity Tag 的資源直接訪問,是 200 OK (from cache) 的結果
圖4 – 同一域名下,有 Entity Tag ,直接訪問就會觸發 304 Not Modified
現在一般都會設置長時間的緩存,正確設置方式參考這兩篇筆記:
參考文獻
- HTTP status code 200 (cache) vs status code 304? – Stack Overflow
- HTTP Codes 200 (from cache) vs 304
后記
搜索了一下,發現這個問題,在網絡上並還沒有定論,也沒發現有人去實測。
想想也對,現在網絡那么快,304 Not Modified 還是 200 OK (from cache),如果不是較真地追求速度,可能大家都覺得區別不大,從而也就沒發現這個問題了。
博主截圖的域名是某著名 IT 公司的 CDN(已反饋)。可見犯這個錯誤的運維 GG 還真不少呢!
本文並不是說影響瀏覽器緩存只有 ETag 這一個因素的意思,請大家不要誤解。只是就“為什么我加了緩存,有的卻是 304 Not Modified, 而不是 200 OK(from cache)”這件事給出一個一針見血的原因和解答。