通過網絡擷取内容既緩慢,成本又高。大的相應需要在用戶端和伺服器之間多次往返通信,這拖延了浏覽器可以使用和處理内容的時間,同時也增加了通信的成本。是以,緩存和重用以前擷取到的資源的能力成為性能優化的一個很關鍵的方面。
(1)通用首部字段(意味着既能用于請求封包,又能用于響應封包)
字段名稱
說明
Cache-Control
控制緩存的行為
Pragma
http1.0的遺留物,值為"no-cache"時禁用緩存
關于Pragma:no-cache,跟Cache-Control: no-cache相同。Pragma: no-cache相容http 1.0 ,Cache-Control: no-cache是http 1.1提供的。是以,Pragma: no-cache可以應用 到 http 1.0 和http 1.1,而Cache-Control: no-cache隻能應用于http 1.1.
(2)請求首部字段
(3)響應首部字段
(4)實體首部字段
Pargram:設定no-cache禁用cache
Expires:通過時間來控制來告訴浏覽器資源緩存過期時間,如果還沒過期就不發送請求。
優先級:Pragram>Cache Control>Expires
上述的首部字段均能讓用戶端決定是否向伺服器發送請求。為了讓用戶端與伺服器之間更有效的利用緩存,HTTP1.1新增了幾個首部字段來做這件事情。
(1)Last-Modified
伺服器将資源傳遞給用戶端時,會将資源最後更改的時間以"Last-Modified:GMT"的形式加載實體首部一起傳回給用戶端。 用戶端會為資源标記上該資訊,再進行下一次請求的時候,會将"Last-Modified:GMT"這個資訊添加到請求中,伺服器做檢查,如果資源沒有被修改過(這個地方自己體會),那麼傳回304狀态碼,如果資源修改過,就傳回200狀态碼。
(2)ETag
為了解決"Last-Modified:GMT"可能存在不準确的問題,HTTP1.1還推出了ETag字段。伺服器會通過某種算法,給資源加上一個唯一的辨別符,把資源傳回給用戶端時,會在實體首部加上"ETag:辨別符"一起傳回給用戶端,用戶端會保留該資源的ETag字段。 當然,用戶端再請求時,會将這個ETag帶上,伺服器隻需比較一下ETag是否跟伺服器上的一緻(除非伺服器上的資源發生了更新,否則伺服器上該資源的ETag是不會變的)。
可以講使用者重新整理通路界面的手段分為三類:
(1)在浏覽器位址欄輸入位址
(2)F5 、點選浏覽器工具欄中的重新整理按鈕 、右鍵選擇重新加載
(3)Ctl+F5
不同的手段網頁加載速度是不一樣的。他們之間的差別何在呢?假設,浏覽器對一個位址沒有進行任何的通路,更沒有緩存檔案。準備工作,位址欄輸入網址,首次通路該網頁,檢視請求與響應資訊可以看到請求頭部沒有任何關于http緩存相關的資訊,響應的頭部卻包含了:
Cache-Control:max-age=31104000
Expires:Thu,20 Jul 2017 02:18:41 GMT
Last-Modified:Fri,15 Jul 2016 04:11:51 GMT
這個時候,浏覽器會對這些資訊進行緩存,直至該檔案過期、使用者清空Cache或者使用者強制資源重新整理。
準備工作完成後,就該比較三者間的差別:
(1)輸入位址 浏覽器發現該資源已經緩存切沒有過期(通過Cache-Control或者Expires頭部),沒有跟伺服器确認,直接使用了了浏覽器的緩存。
(2)F5會讓浏覽器無論如何都發送一個HTTP請求給伺服器,但是他的頭部會加上浏覽器緩存的Last-Modified,伺服器判斷後,發現沒有過期,是以就傳回了一個304狀态碼。這個資訊很小,是以頁面很快就重新整理了。
(3)Ctl+F5是徹底從伺服器要一分資源過來。