瀏覽器http緩存

瀏覽器http緩存

瀏覽器http緩存大體流程圖

瀏覽器http緩存

緩存好處

  • 緩解服務器壓力(不用每次去請求資源);
  • 提高性能(打開本地資源速度固然比請求回來再打開要快得多);
  • 減小帶寬消耗(我相信你能夠理解);

緩存種類

  1. 瀏覽器緩存javascript

    • 瀏覽器對於緩存的處理是根據第一次請求資源時返回的響應頭來肯定的。
  2. 代理服務器緩存
  3. 網關緩存
  4. 數據庫緩存

通用首部字段

cache-control

緩存請求指令
指令 參數 說明
no-cahce 強制向源服務器再次驗證
no-store 不緩存請求或響應的任何內容
max-age = [秒] 必需 指望在指定時間內的響應仍有效
max-state( = [秒]) 可省略 接收已過時的響應
min-fresh = [秒] 必需 指望在指定時間內發響應仍有效
no-transform 代理不可更改媒體類型
only-if-cached 從緩存獲取資源
cache-extension - 新指令標記[token]
緩存響應指令
指令 參數 說明
public 可向任意方提供響應的緩存
private 可省略 僅向特定用戶返回響應
no-cahce 可省略 緩存前必需先確認其有效性
no-store 不緩存請求或響應的任何內容
no-transform 代理不可更改媒體類型
must-revalidate 可緩存但必須再想源服務器進行確認
proxy-revalidate 要求中間緩存服務器對緩存的響應有效性再進行確認
max-age = [秒] 必需 響應的最大Age值
s-maxage = [秒] 必需 公共緩存服務器響應的最大Age值
cache-extension - 新指令標記[token]
表示是否能緩存的指令

public指令java

Cache-Control: publicgit

當使用public指令時,則明確代表其餘用戶也可利用緩存。
private指令

Cache-Control: privategithub

當使用private指令時,響應只以特定的用戶做爲對象,這與public指定的行爲相反。

緩存服務器會對該特定用戶提供資源緩存的服務,對於其餘用戶發送過來的請求,代理服務器則不會返回緩存web

no-cache指令算法

Cache-Control: no-cache數據庫

使用no-cache指令的目的是爲了防止從緩存中返回過時的資源。

客戶端發送的請求若是包含no-cache指令,則表示客戶端將不會緩存過的響應。因而,「中間」的緩存服務器必須把客戶端請求轉發給源服務器。若是服務器返回的響應中包含no-cache指令,那麼緩存服務器不能對資源進行緩存。源服務器之後也將再也不對緩存服務器請求中提出的資源有效性進行確認,且禁止其對響應資源進行緩存操做。segmentfault

no-store指令瀏覽器

Cache-Control: no-store緩存

當使用no-store指令時,暗示請求(和對應的響應)或響應中包含機密信息。所以,該指令規定緩存不能再本地存儲請求或響應的任一部分。

s-maxage指令

Cache-Control: s-maxage=604800 (單位 :秒)

s-maxage指令的功能和max-age指令的相同,他們的不一樣點是s-maxage指令適用於供多位用戶使用的公共緩存服務器。

max-age指令

Cache-Control: max-age = 604800 (單位 :秒)

當客戶端發送的請求中包含max-age指令時,若是斷定緩存資源的緩存時間數值比指定時間的數值更小,那麼客戶端就接收緩存的資源。另外,當指定max-age值爲0,那麼緩存服務器一般須要將請求轉發給源服務器。
當服務器返回的響應中包含max-age指令時,緩存服務器將不對資源的有效性再做確認,而max-age數值表明資源保存爲緩存的最長時間。
應用HTTP/1.1版本的緩存服務器遇到同時存在Expires首部字段的狀況時,會優先處理max-age指令,而忽略掉Expires首部字段。而HTTP/1.0版本的緩存服務器的狀況卻相反,max-age指令會被忽略掉。

min-fresh指令

Cache-Control: min-fresh=60(單位:秒)

min-fresh指令要求緩存服務器返回至少還未過指定時間的緩存資源。好比,當指定min-fresh爲60秒後,在這60秒之內若是有超過有效期限的資源都沒法做爲響應返回了。

max-stale指令

Cache-Control:max-stale=3600(單位:秒)

使用max-stale可指示緩存資源,即便過時也照常接收。

若是指令未指定參數值,那麼不管通過多久,客戶端都會接收響應;若是指令中指定了具體數值,那麼即便過時,只要扔處於max-stale指定的時間內,仍舊會被客戶端接收。

only-if-cached指令

Cache-Control: only-if-cached

使用only-if-cached指令表示客戶端僅在緩存服務器本地緩存目標資源的狀況下才會要求其返回。換言之,該指令要求緩存服務器不從新加載響應,也不會再次確認資源有效性。若發生請求緩存服務器的本地緩存無響應,則返回狀態碼504 Gateway Timeout。

must-revalidate指令

Cache-Control: must-revalidate

使用must-revalidate指令,代理會向源服務器再次驗證即將返回的響應緩存目前是否仍然有效。

若代理沒法連通源服務器再次獲取有效資源的話,緩存必須給客戶端一條504(Gateway Timeout)狀態碼。

另外,使用must-revalidate指令會忽略請求的max-stale指令(即便已經在首部使用了max-stale,也不會再有效果)。

proxy-revalidate指令

Cache-Control: proxy-revalidate

proxy-revalidate指令要求全部的緩存服務器在接收到客戶端帶有該指令的請求返回響應以前,必須再次驗證緩存的有效性。

no-transform指令

Cache-Control: no-transform

使用no-transform指令規定不管是在請求仍是響應中,緩存都不能改變實體主體的媒體類型。

Cache-Control擴展

cache-extension token

Cache-Control: private, community="UCI"

經過cache-extension標記(token),能夠擴展Cache-Control首部字段內的指令。

如上例,Cache-Control首部字段自己沒有community這個指令。藉助extension tokens 實現了該指令的添加。若是緩存服務器不能理解community這個新指令,就會直接忽略。所以,extension tokens僅對能理解它的緩存服務器來講是有意義的。

Date

首部字段Date代表建立HTTP報文的日期和時間。
HTTP/1.1協議使用在RFC1123中規定的日期時間的格式,以下示例。
Date: Tue, 03 Jul 2012 04:40:59 GMT
以前的HTTP協議版本中使用在RFC850中定義的格式,以下所示。
Date: Tue, 03-Jul-12 04:40:59 GMT
除此以外,還有一種格式。它與C標準庫內的asctime()函數的輸出格式一致。
Date: Tue Jul 03 04:40:59 2012

Pragma

Pragma是HTTP/1.1以前版本的歷史遺留字段,僅做爲與HTTP/1.0的向後兼容而定義。

Pragma: no-cache

該首部字段屬於通用首部字段,但只用在客戶端發送的請求中。客戶端會要求全部的中間服務器不返回緩存的資源。

全部的中間服務器若是都能以HTTP/1.1爲基準,那直接採用Cache-Control: no-cache指定緩存的處理方式是最爲理想的。但要總體掌握所有中間服務器使用的HTTP協議版本中倒是不現實的。所以,發送的請求會同時含有下面兩個首部字段。

Cache-Control: no-cache
Pragma: no-cache

請求首部字段

If-Match/If-Modified-Since/If-None-Match/If-Range/If-Unmodified-Since

形如If-xxx這種形式的請求首部字段,均可稱爲條件請求。服務器接收到附帶條件的請求後,只有判斷指定條件爲真時,纔會執行請求。

If-Match

只有當If-Match的值與服務器上實體的Etag值一致時,服務器纔會接受請求。反之,則返回狀態碼412 Precondition Failed的響應。

If-Modified-Since

若是在If-Modified-Since字段指定的日期時間後,資源發生了更新,服務器會接受請求。好比請求首部 If-Modified-Since: Thu, 15 Apr 2004 00:00:00 GMT,而服務器上的 Last-Modified: Sun 29 Aug 2004 14:03:05 GMT,由於是在2004年4月15日以後更新過的資源,因此服務器會接受請求。

If-None-Match

只有在If-None-Match的字段值與Etag值不一致時,可處理該請求。與If-Match首部字段的做用相反。

If-Range

If-Range HTTP 請求頭字段用來使得 Range 頭字段在必定條件下起做用:當字段值中的條件獲得知足時,Range 頭字段纔會起做用,同時服務器回覆206 部份內容狀態碼,以及Range 頭字段請求的相應部分;若是字段值中的條件沒有獲得知足,服務器將會返回 200 OK 狀態碼,並返回完整的請求資源。

If-Unmodified-Since

首部字段 If-Unmodified-Since和首部字段 If-Modified-Since的做用相反。他的做用是告知服務器,指定的請求資源只有在字段值內指定的日期時間以後,未發生更新的狀況下,才能處理請求。若是在指定的日期時間後發生了更新,則以狀態碼412 Precondition Faied做爲相應返回。

響應首部字段

響應首部字段是由服務器端向客戶端返回響應報文中所使用的字段,用於補充響應的附加信息、服務器信息、以及對客戶端的附加要求等信息。

Age

首部字段Age能告知客戶端,源服務器在多久前建立了響應。字段值的單位爲秒。

若建立該響應的服務器是緩存服務器,Age值是指緩存後的響應再次發起認證到認證完成的時間值。代理建立響應時必須加上首部字段Age。Age消息頭的值一般接近於0。表示此消息對象剛剛從原始服務器獲取不久;其餘的值則是表示代理服務器當前的系統時間與此應答消息中的通用消息頭 Date 的值之差。

Etag

首部字段Etag能告知客戶端實體標識。它是一種可將資源以字符串形式作惟一性標識的方式。服務器會爲每份資源分配對應的Etag值。

另外,當資源更新時,Etag值也須要更新。生成Etag值時,並無統一的算法規則,而僅僅是由服務器來分配。

強Etag值:不論實體發生多麼細微的變化都會改變其值。Etag: "usagi-1234"

弱Etag值:弱Etag值只用於提示資源是否相同。只有資源發生了根本改變,產生差別時纔會改變Etag值。這時,會在字段值最開始處附加W/。

Etag:W/"usagi-1234"

實體首部字段

Expires

Expires: Wed, 04 Jul 2012 08:26:05 GMT

首部字段 Expires會將資源失效的日期告知客戶端。緩存服務器在接受到含有首部字段 Expires的響應後,會以緩存來應答請求,在 Expires字段值指定的時間以前,響應的副本會一直被保存。當超過指定的時間後,緩存服務器在請求發送過來時,會轉向源服務器請求資源。

源服務器不但願緩存服務器對資源緩存時,最好在Expires字段內寫入與首部字段Date相同的時間值。

可是,當首部字段Cache-Control有指定max-age指令時,比起首部字段Expires,會優先處理max-age指令。

Last-Modified

Last-Modified: Wed, 23 May 2012 09:59:55 GMT

首部字段 Last-Modified指明資源最終修改時間。通常來講,這個值就是Request-URI指定資源被修改的時間。但相似使用CGI腳本進行動態數據處理時,該值有可能會變成數據最終修改時的時間。

參考與推薦

《圖解HTTP》
緩存詳解
淺談web緩存
淺談瀏覽器緩存

相關文章
相關標籤/搜索