當一個客戶端(通常是瀏覽器)向web服務器發送一個請求,如果web服務器返回304響應,則表示此請求的本地緩存是最新的,可以直接使用。這種方法可以節省帶寬,避免重復響應。
一般來說,可以將一個請求分為兩類,二者以請求中包含的request header來區分:
有條件的請求(Conditional Validation Request) | 無條件的請求(Unconditional Request) |
If-Modified-Since 或者 If-None-Match |
無 |
一般來說If-Modified-Since的值來自於上一次這條請求的Response中的Last-Modified,If-None-Match的值來自於上一次這條請求的Response中的ETag。
如果是Conditional Request,則服務器去校驗這兩個header,並以此判斷客戶端的緩存是否是最新的,如果是,則返回一個HTTP/304 Not Modified header,其中response body為空;如果不是,則返回一個HTTP/200 OK header,並將最新的內容放在response body中。
所以如果需要很好的利用HTTP 304 Response,首先需要Web服務器,在其響應頭中包含合理的值,例如Last-Modified和ETag,然后客戶端才能據此發送Conditional Request。