鍍金池/ 問答/Java  Linux  HTML/ 關于瀏覽器緩存和本地靜態(tài)資源的問題

關于瀏覽器緩存和本地靜態(tài)資源的問題

學nginx的時候把瀏覽器的緩存機制琢磨了一下。把相關http header研究了一下。
然后突然想起一個問題,就是以前在本地開發(fā)的過程中修改js文件時由于瀏覽器緩存導致新的改動并沒有生效,必須清空才可以。
然后就想結合剛了解的http緩存機制來弄清楚以前那個js文件不生效的問題。
可是問題來了。為什么js文件在修改之后,刷新頁面,瀏覽器沒有從本地服務器獲取新的js文件而是從緩存中讀取。
我確認了request header 里的cache-control是 max-age=0,就是說向服務器確認該js文件是否需要更新。
那有改動的話應該是重新請求js文件 且status為200才對呃。。。。
還是說只要js文件的名字沒變。那么瀏覽器就認為緩存是存在的,可以直接讀?。??并不需要判斷etag或者last-modified

回答
編輯回答
心沉

request header的cache-control: max-age=0只有在CTRL + F5強刷時才會加入
正常訪問并不會加這種頭

你要控制瀏覽器的行為,應該在服務端的cache-control里配置
不能脫離服務端的cache-control討論瀏覽器的緩存機制

request header是給服務器看的,不是給瀏覽器看的,你的理解本身就不對

服務端通過cache-control、etag、last-modified告訴瀏覽器和緩存服務器應該怎么存儲和處理這個URL
如果符合一定規(guī)則(具體看下方文章),瀏覽器并不會向服務器發(fā)出請求,而是直接使用本地緩存

如果符合一定規(guī)則需要向服務器發(fā)出請求,瀏覽器通過If-Modified-Since If-None-Match cache-control告訴服務器應該響應304還是200

這篇文章已經講得很清楚了:
https://developers.google.com...

2017年2月9日 19:18
編輯回答
萌面人

你自己一堆概念都沒有搞清楚。

可是問題來了。為什么js文件在修改之后,刷新頁面,瀏覽器沒有從本地服務器獲取新的js文件而是從緩存中讀取。

首先,瀏覽器不知道你的 js 文件到底有沒有改。瀏覽器如果沒有發(fā)出遠端請求,那么一定是“緩存頭”機制在發(fā)生作用。(前提是瀏覽器自己正確實現了 HTTP 協議的相關要求)

我確認了request header 里的cache-control是 max-age=0,就是說向服務器確認該js文件是否需要更新。
那有改動的話應該是重新請求js文件 且status為200才對呃。。。。

這是你服務器的事,不是瀏覽器這個客戶端的事。

還是說只要js文件的名字沒變。那么瀏覽器就認為緩存是存在的,可以直接讀?。??并不需要判斷etag或者last-modified

文件名沒有變,緩存策略受“頭”控制。
文件名變了,一定不會有緩存,因為瀏覽器標識資源是依賴 URI 的,文件名(準備說是是 URL 中的 path)是這個 URI 的一部分。

2017年11月1日 15:43
編輯回答
祈歡

第一你可以用chrome開發(fā)者工具中network查看,具體的js是從disk,或者內存,還是獲取最新。
第二更新緩存的最有效辦法就是更新版本號,如j.js?v=1.0

2017年11月6日 13:35