關於靜態資源緩存的配置,主要是後端開發的工做,前端開發的同窗確定都有必定的瞭解但並不深刻。前端
今天咱們就來全面的梳理一下靜態資源緩存:nginx
首先仍是從一個小故事開始:小c同窗是一名前端程序猿,負責公司門戶網站的維護。這一天,他的大boss丟給他一張5M的大圖,讓他放到網站的首頁。 這麼大的資源,若是每次用戶打開網站以後都要從新從服務器請求一遍,必然形成用戶加載速度的減慢和帶寬的浪費。 因而咱們聰明的主人公想到了緩存的方法:把圖片資源緩存到本地,下次須要這個資源的時候沒必要請求網絡資源,直接從緩存中讀取。chrome
因而小c同窗又開啓了敲代碼之旅。。。後端
緩存存在於http的get請求中,瀏覽器能夠根據request和response的header中字段的值、客戶端時間等,智能地判斷使用本地存儲的內容仍是服務端返回的內容。瀏覽器
其中,強緩存又分爲兩種:磁盤緩存disk cache和內存緩存memory cache緩存
首次請求服務器
Expires:絕對過時時間 設置一個絕對過時時間Date字符串, 優先級比Cache-Control低, 同時設置Expires和Cache-Control則後者生效. 這種方式有一個明顯的缺點,因爲失效時間是一個絕對時間,因此當客戶端本地時間被修改之後,服務器與客戶端時間誤差變大之後,就會致使緩存混亂。網絡
Cache-Control:設置相對過時時間,以秒爲單位,始終與客戶端時間相比較。分佈式
no-cache: 數據內容不能被緩存, 每次請求都從新訪問服務器,如有max-age, 則緩存期間不訪問服務器.優化
no-store: 不只不能緩存, 連暫存也不能夠(即: 臨時文件夾中不能暫存該資源)
private(默認): 只能在瀏覽器中緩存, 只有在第一次請求的時候才訪問服務器, 如有max-age, 則緩存期間不訪問服務器
public: 能夠被任何緩存區緩存, 如: 瀏覽器、服務器、代理服務器等
max-age: 相對過時時間, 即以秒爲單位的緩存時間
Etag ETag將返回給瀏覽器一個資源ID(字符串), 若是有了新版本則正常發送並附上新ID, 不然返回304. ETag是爲了解決Last-Modified只能精確到秒的問題,能夠精確到毫秒。可是在服務器集羣狀況下, 必須保證每一個分佈式服務器返回相同的ETag.
Last-Modified: 該資源的最後修改時間, 在瀏覽器下一次請求資源時, 瀏覽器將先發送一個請求到服務器上, 並附上If-odified-Since頭來講明瀏覽器所緩存資源的最後修改時間, 若是服務器發現沒有修改, 則直接返回304(Not Modified)迴應信息給瀏覽器(內容不多), 若是服務器對比時間發現修改了, 則照常返回所請求的資源.
資源緩存在用戶的電腦上,瀏覽器目錄中。mac os系統,chrome瀏覽器的緩存存儲位置是:/Users/XXX/Library/Caches/Google/Chrome/Default/Cache,默認緩存文件沒有後綴名,咱們能夠手動添加後綴名
效果:
在服務端的nginx中配置:
在服務器中配置 cache-control:no-store,禁止靜態資源緩存
生產環境中,用戶以前可能有200緩存,當資源有更改的時候,因爲不能讓用戶手動清除緩存,可能出如今舊緩存有效期內,老用戶顯示緩存中內容的狀況。 解決方法:把文件名和文件內容關聯起來,好比js文件,每次修改文件內容後都關聯的修改文件名稱,強制用戶使用新的文件,不使用緩存。
CDN回源 nginx相關配置 逐級優化字段 爲什麼遞進