這兩個字段都和HTTP協議的緩存控制相關。瀏覽器
瀏覽器緩存機制是經過HTTP協議Header裏的Cache-Control(或Expires)和Last-Modified(或 Etag)等字段來實現。緩存
這兩個字段的做用:服務器
1. 接收響應時,瀏覽器決定文件是否須要被緩存;工具
2. 須要加載文件時,瀏覽器決定是否須要發出請求的字段。spa
看一些例子:開發
Cache-Control:max-age=115360000,表示緩存有效期爲115360000秒。若是115360000秒內須要再次請求這個文件,瀏覽器不會發出向服務器發出請求,而是直接使用本地的緩存的文件。這是HTTP/1.1標準中的字段。rem
這總狀況能在Chrome開發者工具的Network標籤頁裏看到from disk cache的提示:get
從本地緩存中讀取文件很是快速,上面的例子只花費了6毫秒:it
Expires: Thu, 31 Dec 2018 23:55:55 GMT,表示該文件的過時時間是2018年12月31日晚上23點55分55秒,在這個時間以前瀏覽器都不會再次發出請求去獲取該文件。這是HTTP/1.0中的字段。ast
在Chrome開發者工具的network標籤頁裏能看到:
下面兩個字段是發起請求時,服務器決定文件是否須要更新的字段。
Last-Modified: Thu, 26 Jul 2018 05:41:21 GMT,這表示這個文件最後的修改時間是2018年7月26日5點41分21秒。
瀏覽器會在下次請求的時候,把Last-Modified的值做爲Request Header的If-Modified-Since字段帶上。若是瀏覽器緩存的文件已經超過了Cache-Control(或者Expires),那麼須要加載這個文件時,就會發出請求,請求的Header有一個字段爲If-Modified-Since,以下圖所示:
服務器接收到請求後,會把文件的Last-Modified時間和這個時間對比,若是時間沒變,那麼瀏覽器將返回304 Not Modified給瀏覽器:
若是時間有變化,那麼服務器會返回200 OK,並返回相應的內容給瀏覽器。
下圖第9行的get_header_field方法是服務器從瀏覽器發送過來的HTTP請求提取頭部字段If-Modified-Since的值。
下圖第16行的set_header_field方法是服務器設置Last-Modified頭部字段的值。
下圖就是服務器設置304 Not Modified響應的位置:
要獲取更多Jerry的原創技術文章,請關注公衆號"汪子熙"或者掃描下面二維碼: