HTTP 200 OK和HTTP 304 Not modified的由來

i042416發表於2018-09-03

這兩個欄位都和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的由來

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24475491/viewspace-2213495/,如需轉載,請註明出處,否則將追究法律責任。

相關文章