爲何有的緩存是 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 沒有移除時觸發。這是通過查閱資料得出的結論。博主實際測試了一下,結論與之相符:緩存
圖1 – 直接訪問有緩存的網站都觸發 200 OK (from cache)圖2 – 刷新瀏覽器則會觸發 304 Not Modified圖3 – 同一域名下,沒有 Entity Tag 的資源直接訪問,是 200 OK (from cache) 的結果圖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 補充的評論。
轉自: