HTTP請求的緩存(Cache)機制

原文地址:http://small.aiweimeng.top/index.php/archives/58.htmlphp

先來一張圖:html

 

####下面簡單的來描述一下HTTP Cache機制web

當資源資源第一次被訪問的時候,http status返回200,在頭部攜帶當前資源的描述信息,eg:瀏覽器

最後修改的時間:```Last-Modified```
資源狀態惟一標識:```Etag```
資源在客戶端緩存的過時時間:```Expires```緩存


同時瀏覽器會將資源緩存到cache目錄,並保存文件描述信息。服務器

當客戶端第二次請求資源時,會先檢查cache目錄中是否含有該資源,若是有,而且還沒到Expires設置的時間,
即文件尚未過時,那麼此時客戶端將直接從Cache目錄中讀取文件,而再也不發送請求網絡

若是資源已通過期,客戶端會發送一次http請求到服務器,同時在header攜帶上次修改的時間:
```text
If-Modified-Since Thu, 26 Nov 2009 13:50:19 GMT
If-None-Match "8fb8b-14-4794674acdcc0"
```orm

####爲何會返回上一次的信息呢?htm

web服務器在接收到請求時,會先解析header裏面的信息,而後校驗頭部信息。
若是該資源文件從上次時間到如今都沒有修改或者Etag信息沒有變化,,則web服務器將會直接返回304狀態,
從而不會在資源文件,狀態頭部信息以下:
```text
(Status-Line) HTTP/1.1 304 Not Modified
Date Thu, 26 Nov 200914:09:07 GMT
Server Apache/2.2.11 (Unix)PHP/5.2.9
Connection Keep-Alive
Keep-Alive timeout=5, max=100
Etag "8fb8b-14-4794674acdcc0"
```blog

這樣,就可以很大程度上減小網絡帶寬以及提高用戶的瀏覽器體驗。
固然,若是服務器通過匹配發現文件修改過了,就會將文件資源返回,並帶上新文件狀態信息。


####基本字段

```Expires:```
文件在本地緩存的過時時間,若是客戶端發現緩存中的文件沒有過時,則不發送請求


```Cache-Control:```
Cache-Control指定請求和響應遵循的緩存機制。
在請求消息或響應消息中設置Cache-Control並不會修改另外一個消息處理過程當中的緩存處理過程。

請求時的緩存指令包括
```text
no-cache
no-store
max-age
max-stale
min-fresh
only-if-cached
```
響應消息中的指令包括
```text
public
private
no-cache
no- store
no-transform
must-revalidate
proxy-revalidate
max-age
```

####指令含義:

```public:```

響應可被任何緩存區緩存。

```Private:```

對於單個用戶的整個或部分響應消息,不能被共享緩存處理。
這容許服務器僅僅描述當用戶的部分響應消息,此響應消息對於其餘用戶的請求無效。   

```no-cache:```

請求或響應消息不能緩存。

```no-store:```

用於防止重要的信息被無心的發佈。
在請求消息中發送將使得請求和響應消息都不使用緩存。

```max-age:```

客戶端能夠接收生存期不大於指定時間(以秒爲單位)的響應。  

```min-fresh:```

客戶機能夠接收響應時間小於當前時間加上指定時間的響應。   

```max-stale:```

客戶端能夠接收超出超時期間的響應消息。
若是指定max-stale消息的值,那麼客戶端能夠接收超出超時期指定值以內的響應消息。

 


####```Etag/If-None-Match``` 

一對驗證文件實體的標記 "Entity Tag:的響應/請求頭.
Apache中,ETag的值,默認是對文件的索引節(INode),大小(Size)和最後修改時間(MTime)進行Hash後獲得的

```Last-Modified/If-Modified-Since:```

一對驗證文件的修改時間的響應/請求頭

Expires、 Cache-Control、Last-Modified、ETag是RFC2616(HTTP/1.1)協議中和網頁緩存相關的幾個字段。 前兩個用來控制緩存的失效日期,瀏覽器可經過它來斷定,需不須要發出HTTP請求; 後兩個用來驗證網頁的有效性,服務器端利用它來驗證這個文件是否須要從新返回Last-Modified VS Etag

既然有了Last-Modified,爲何還要用ETag字段呢?由於若是在一秒鐘以內對一個文件進行兩次更改,Last-Modified就會不正確。所以,HTTP/1.1利用Entity Tag頭提供了更加嚴格的驗證。

相關文章
相關標籤/搜索