淺析HTTP緩存機制

HTTP緩存機製作為 web 性能優化的重要手段,對於從事 Web 開發的同學們來說,應該是知識體系庫中的一個基礎環節,同時對於有志成為前端架構師的同學來說是必備的知識技能。

HTTP請求的過程

我們可以知道,從在瀏覽器地址欄敲入域名-DNS解析-實際IP-(中間可能多個代理伺服器分發)- 源伺服器,請求抵達源伺服器后,在伺服器上找到請求的資源,再通過代理伺服器一層層的返回數據到瀏覽器端。

緩存要解決的核心問題為減少客戶端對源伺服器的HTTP請求,提升性能。試想,像jquery、bootstrap這種更新不頻繁的資源當然沒有必要每次都從源伺服器上獲取。

實際上大部分靜態文件在下一次內容更新之前都沒有必要再走一遍網路從源伺服器獲取

Advertisements

HTTP報文中與緩存相關的首部欄位

1、通用頭

cache-control:控制緩存的行為 pragma:值為no-cache時禁用緩存,http1.0的

2、請求頭

if-match:比較ETag是否一致 if-none-match:比較ETag是否不一致

if-modified-since:比較資源最後修改時間是否一致 if-unmodified-since:比較資源最後修改時間是否不一致

3、響應頭

ETag:資源的匹配信息

4、實體頭

Expires:實體主體過期的時間

Last-Modified:資源的最後一次修改時間

1、Pragma

當該欄位值為「no-cache」的時候,會知會客戶端不要對該資源讀緩存,即每次都得向伺服器發一次請求才行。Pragma屬於通用首部欄位,在客戶端上使用時,常規要求我們往html上加上這段meta元標籤(而且可能還得做些hack放到body後面去):

Advertisements

<meta http-equiv="Pragma" content="no-cache">

但是這行代碼的用處很有限,因為只有IE識別。

2、Expires

有了Pragma來禁用緩存,自然也需要有個東西來啟用緩存和定義緩存時間,對http1.0而言,Expires就是做這件事的首部欄位。

Expires的值對應一個GMT(格林尼治時間),比如「Mon, 22 Jul 2002 11:12:01 GMT」來告訴瀏覽器資源緩存過期時間,如果還沒過該時間點則不發請求。

但是,響應報文中Expires所定義的緩存時間是相對伺服器上的時間而言的,如果客戶端上的時間跟伺服器上的時間不一致(特別是用戶修改了自己電腦的系統時間),那緩存時間可能就沒啥意義了。

3、catch-control

這是一個比較重要的頭部,當報文中同時出現了Pragma、Expires、Cache-control的時候,以cache-control為主。

http1.1新增了 Cache-Control 來定義緩存過期時間,Cache-Control是一個通用首部欄位,這意味著它能分別在請求報文和響應報文中使用。

在請求頭中使用時,其值(表的出處)可能為:

在響應頭部使用時,其值可能為:

上述的首部欄位均能讓客戶端決定是否向伺服器發送請求,比如設置的緩存時間未過期,那麼自然直接從本地緩存取數據即可(在chrome下表現為200 from cache),若緩存時間過期了或資源不該直接走緩存,則會發請求到伺服器去。

現在有這樣一種情況,瀏覽器上緩存的內容過期了,而伺服器端該資源並沒有進行過更改,如果這時候瀏覽器向伺服器重新發送請求,伺服器把資源重新發送給瀏覽器一遍,如果文件內容很大,那麼就會很浪費帶寬和資源。所以,http又加了幾種頭部:

4、LastModified

伺服器將資源傳遞給客戶端時,會將資源最後更改時間以Last-Modified的形式加在實體頭部返回給客戶端。客戶端會為該資源標記上該信息。等下次請求的時候,客戶端會把該信息以If-modified-since附帶在請求報文中,一併發送給伺服器。若時間同伺服器上的一致,說明資源沒有被改動過,返回304,直接請求緩存即可,如果不一致,則資源改動了,那麼就返回200,把新資源也返回給客戶端

5、ETag

伺服器會通過某演算法,給資源計算得出一個唯一的標識符,在實體頭部加上ETag返回給客戶端。客戶端會保留ETag欄位。下次請求時,用在if-no-match中放上ETag的值,發送給伺服器,若客戶端的if-no-match值和伺服器端的ETag值一致,則返回304,客戶端可直接訪問緩存;如果不一致,則返回200,並將新資源一起返回給客戶端。

——————————————————————

SSL證書是HTTP明文協議升級HTTPS加密協議的重要渠道,是網路安全傳輸的加密通道。關於更多SSL證書的資訊,請關注數安時代(GDCA)。GDCA致力於網路信息安全,已通過WebTrust 的國際認證,是全球可信任的證書籤發機構。GDCA專業技術團隊將根據用戶具體情況為其提供最優的產品選擇建議,並針對不同的應用或伺服器要求提供專業對應的HTTPS解決方案。

Advertisements

你可能會喜歡