天天看點

HTTP 200 OK和HTTP 304 Not modified的由來

這兩個字段都和HTTP協定的緩存控制相關。

HTTP 200 OK和HTTP 304 Not modified的由來

浏覽器緩存機制是通過HTTP協定Header裡的Cache-Control(或Expires)和Last-Modified(或 Etag)等字段來實作。

這兩個字段的作用:

1. 接收響應時,浏覽器決定檔案是否需要被緩存;

2. 需要加載檔案時,浏覽器決定是否需要送出請求的字段。

看一些例子:

Cache-Control:max-age=115360000,表示緩存有效期為115360000秒。如果115360000秒内需要再次請求這個檔案,浏覽器不會發出向伺服器送出請求,而是直接使用本地的緩存的檔案。這是HTTP/1.1标準中的字段。

這總情況能在Chrome開發者工具的Network标簽頁裡看到from disk cache的提示:

HTTP 200 OK和HTTP 304 Not modified的由來

從本地緩存中讀取檔案非常快速,上面的例子隻花費了6毫秒:

HTTP 200 OK和HTTP 304 Not modified的由來

Expires: Thu, 31 Dec 2018 23:55:55 GMT,表示該檔案的過期時間是2018年12月31日晚上23點55分55秒,在這個時間之前浏覽器都不會再次送出請求去擷取該檔案。這是HTTP/1.0中的字段。

在Chrome開發者工具的network标簽頁裡能看到:

HTTP 200 OK和HTTP 304 Not modified的由來

下面兩個字段是發起請求時,伺服器決定檔案是否需要更新的字段。

Last-Modified: Thu, 26 Jul 2018 05:41:21 GMT,這表示這個檔案最後的修改時間是2018年7月26日5點41分21秒。

HTTP 200 OK和HTTP 304 Not modified的由來

浏覽器會在下次請求的時候,把Last-Modified的值作為Request Header的If-Modified-Since字段帶上。如果浏覽器緩存的檔案已經超過了Cache-Control(或者Expires),那麼需要加載這個檔案時,就會送出請求,請求的Header有一個字段為If-Modified-Since,如下圖所示:

HTTP 200 OK和HTTP 304 Not modified的由來

伺服器接收到請求後,會把檔案的Last-Modified時間和這個時間對比,如果時間沒變,那麼浏覽器将傳回304 Not Modified給浏覽器:

HTTP 200 OK和HTTP 304 Not modified的由來

如果時間有變化,那麼伺服器會傳回200 OK,并傳回相應的内容給浏覽器。

下圖第9行的get_header_field方法是伺服器從浏覽器發送過來的HTTP請求提取頭部字段If-Modified-Since的值。

HTTP 200 OK和HTTP 304 Not modified的由來

下圖第16行的set_header_field方法是伺服器設定Last-Modified頭部字段的值。

HTTP 200 OK和HTTP 304 Not modified的由來

下圖就是伺服器設定304 Not Modified響應的位置:

HTTP 200 OK和HTTP 304 Not modified的由來

要擷取更多Jerry的原創技術文章,請關注公衆号"汪子熙"或者掃描下面二維碼:

HTTP 200 OK和HTTP 304 Not modified的由來
HTTP 200 OK和HTTP 304 Not modified的由來

繼續閱讀