當前位置:首頁 » 硬碟大全 » 協商緩存是什麼意思
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

協商緩存是什麼意思

發布時間: 2023-05-17 15:00:39

Ⅰ 瀏覽器強緩存與協商緩存

主要看response headers中Cache-Control的值
Cache-Control取值含義:
private:僅瀏覽器可以緩存
public:瀏覽器和代理伺服器都可以緩存
max-age=xxx 過期時間(秒)
no-cache:不進行強緩存
no-store:不強緩猜脊陵存也不協商緩存

觸發條件:
1、野差Cache-Control的值為no-cache(不強緩存)
2、max-age 設置的時間導致文件過期了

ETag:每個文件都有一個,改動文件就會變(類似md5)
Etag是伺服器自動生成或者由開發者生成的對應資源在伺服器端的唯一穗戚標識符。
Last-Modified:文件修改時間

每次http返回來response headers中都會帶ETag和Last-Modefied ,下次請求時在request header就把這兩個給帶上但是名字有了變化(ETag->If-None-Match,Last-Modified->If-Modified-Since),服務端把帶過來的標識與之前的標識進行對比 判斷是否更改過了

請求資源時,把用戶本地該資源的 ETag 同時帶到服務端,服務端和最新資源做對比。
如果資源沒更改,返回304,瀏覽器讀取本地緩存。
如果資源有更改,返回200,返回最新的資源。

1.從伺服器獲取新的資源
2.命中強緩存,且資源沒過期,直接讀取本地緩存(請求成功 文件大小size會顯示 from disk cache)
3.命中協商緩存,且資源未更改,讀取本地緩存。
注意:協商緩存無論如果,都要向服務端發請求的,只不過,資源未更改時,返回的只是header信息,所以size很小;而資源有更改時,還要返回body數據,所以size會大。

可以有後端伺服器配置,也可以在nginx中配置

參考鏈接: https://blog.csdn.net/Amnesiac666/article/details/121101165

疑問1:max-age時間是怎麼來的 從什麼時候開始計時
疑問2:為什麼是response header中的而不是request header中

Ⅱ 關於html緩存設置

通過HTTP的META設置expires和cache-control

指令不區分大小寫,並且具有可選參數,可以用令牌或者帶引號的字元串語法。多個指令以逗號分隔。

客戶端可以在HTTP請求中使用的標准 Cache-Control 指令。

Cache-Control: max-stale[=<seconds>]
Cache-Control: min-fresh=<seconds>
Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: only-if-cached

伺服器可以在響應中使用的標准 Cache-Control 指令。

Cache-control: no-cache
Cache-control: no-store
Cache-control: no-transform
Cache-control: public
Cache-control: private
Cache-control: proxy-revalidate
Cache-Control: max-age=<seconds>
Cache-control: s-maxage=<seconds>

拓展緩存指令不是HTTP緩存標準的一部分,使用前請注意檢查 兼容性 !

Cache-control: immutable
Cache-control: stale-while-revalidate=<seconds>
Cache-control: stale-if-error=<seconds>

public
表明響應可以被任何對象(包括:發送請求的客戶端,代理伺服器,等等)緩存。

private
表明響應只能被單個用戶緩存,不能作為共享緩存(即代理伺服器不能緩存它)。

no-cache
強制所有緩存了該響應的緩存用戶,在使用已存儲的緩存數據前,發送帶驗證器的請求到原始伺服器

only-if-cached
表明如果緩存存在,只使用緩存,無論原始伺服器數據是否有更新

max-age=<seconds>
設置緩存存儲的最大周期,超過這個時間緩存被認為過期(單位秒)。與Expires相反,時間是相對於請求的時間。

s-maxage=<seconds>
覆蓋max-age 或者 Expires 頭,但是僅適用於共享緩存(比如各個代理),並且私有緩存中它被忽略。

max-stale[=<seconds>]
表明客戶端願意接收一個已經過期的資源。 可選的設置一個時間(單位秒),表示響 應不能超過的過時時間。

min-fresh=<seconds>
表示客戶端希望在指定的時間內獲取最新的響應。

must-revalidate
緩存必須在使用之前驗證舊資源的狀態,並且不可使用過期資源。

proxy-revalidate
與must-revalidate作用相同,但它僅適用於共享緩存(例如代理),並被私有緩存忽略。

immutable
表示響應正文不會隨時間而改變。資源(如果未過期)在伺服器上不發生改變,因此客戶端不應發送重新驗證請求頭(例如If-None-Match或If-Modified-Since)來檢查更新,即使用戶顯式地刷新頁面。在Firefox中,immutable只能被用在 https:// transactions.

發送如下指令可以關閉緩存。此外,可以參考Expires 和 Pragma 標題。

對於應用程序中不會改變的文件,你通常可以在發送響應頭前添加積極緩存。這包括例如由應用程序提供的靜態文件,例如圖像,CSS文件和JavaScript文件。另請參閱Expires標題。

緩存主要兩個策略 強制緩存 ,協商緩存
強制緩存就是設置本地資源html img js等等緩存多長時間 超過時間就去伺服器端取。
協商緩存就是每次都詢問伺服器資源是否已經過期 沒有過期就使用緩存 已經過期就從伺服器上重新取。

緩存流程可以分三個階段 本地緩存,協商緩存 ,緩存失敗

現在的vue項目里都不是這樣緩存的 我個人感覺這是在靜態頁面時的緩存辦法
現在都是webpack打包時通過 hash chunkhash contenthash來決定緩存方式 主要就是在請求的文件名稱後面加一個id 來判斷文件是否已經更新。

前端HTTP緩存

在面試的時候總是遇到緩存相關問題,回答總是停留緩存就是從瀏覽器中獲取,不向伺服器發送請求,回答的不讓面試官滿意,索性抽點時間整理一下前端相關的緩存,希望下次回答的時候能夠多講點。

前端緩存分為 強緩存 協商緩存 ,強緩存就是在緩存未失效時,不在請求服務端,協商緩存就是去跟伺服器比較是否需要重新獲取資源 。

強緩存分為兩種, Cache-control Expires Expires 是HTTP1.0的東西,它的值是一個格林時間,比如 Expires: Wed, 21 Oct 2015 07:28:00 GMT ,由於伺服器端和瀏覽器端的時間差異問題,瀏覽器比伺服器時間快,會導致緩存失效。 Cache-control 是HTTP1.1時代的新東西,設置的是一個相對時間, Cache-Control:public, max-age=31536000 ,在31536000秒後才緩存才失效, Cache-control 有很多取值。

強緩存在緩存失效內,不會從原始伺服器獲取新的數據,假如在緩存時段內伺服器有資源更新,會導致資源獲取不及時。

協商緩存有兩組報文

Ⅳ 瀏覽器中的緩存

在我們使用瀏覽器訪問網頁的過程中,瀏覽器經常會緩存各種網頁中的內容。當再次訪問同一個網頁時,可以發現部分內容是從緩存直接讀取的。
查看HTTP的響應信息,就能發現一些端倪。比如響應 200 from cache; 304 not modify 等等。
下面對瀏覽器使用緩存的各種情形做一下分析:

Pragma是HTTP 1.0版本的一個參數,在HTTP 1.1版本裡面這個參數也會生效,如果不想瀏覽器緩存網頁的內容,可以在 Response header 裡面加上 :Pragma: no-cache。

Cache-Control是HTTP 1.1版本新增的一個參數。

Cache-Control:no-store 不允許緩存

Cache-Control:no-cache 不允許直接使用緩存,需要先發起請求和伺服器協商(這個經常被誤認為是不允許緩存,實際上它的作用是讓瀏覽器在使用緩存前先請求服務端一次,確認內容是否有更新)

這樣的響應代表沒有跟服務端進行交互,內容是直接從本地讀取的。

Expires和Cache-control: max-age= 有類似的作用,都是指定緩存內容的有效周期,Expires指定的格式是格林威治時間,max-age則是秒數。

服務端也可以在 Response header 里加上 Last-Modified,它的格式是格林威治時間,再次請求時,瀏覽器的 Request header 中會多出一個叫 If-Modified-Since的值,通過比較這兩個值是否一致來決定是否返回304。

ETag的用法和 Last-Modified 類似,值是一種文件指紋。比如:ETag:"5a3ccff0-5dc"。
服務端在 Response header 里加上 ETag,再次請求時,瀏覽器的 Request header 中會多出一個叫 If-None-Match的值,通過比較這兩個值是否一致來決定是否返回304。

總體來說,瀏覽器使用緩存時有兩種表現:
1.直接從本地讀取,不與服務端有交互,就是 200 OK (from memory cache)。
2.請求一次服務端,查看本地緩存是否生效,這種方式叫 協商緩存。如果服務端判斷緩存有效,將不返回完整內容,而是返回 304 Not Modified。

在優先順序上 Pragma > Cache-Control > Expires。

Ⅳ 前端緩存的理解 或者 前端數據持久化的理解(強制緩存、協商緩存)

緩存可以說是性能優化中簡單高效的一種優化方式了。一個優秀的緩存策略可以縮短網頁請求資源的距離,減少延遲,並且由於 緩存文件可以重復利用 ,還可以減少帶寬,降低網路負荷。

        對於一個數據請求來說,可以分為發起 網路請求、後端處理、瀏覽器響應 三個步驟。瀏覽器緩存可以幫助我們在第一和第三步驟中優化性能。比如說直接使用緩存而不發起請求,或者發起了請求但後端存儲的數據和前端一致,那麼就沒有必要再將數據回傳回來,這樣就減少了響應數據。

①不存在該緩存結果和緩存標識,強制緩存失效,則直接向伺服器發起請求

②存在該緩存結果和緩存標識,但該結果已失效,強制緩存失效,則使用協商緩存

③存在該緩存結果和緩存標識,且該結果尚未失效,強制緩存生效,直接返回該結果

控制強制緩存的欄位分別是Expires和Cache-Control,其中Cache-Control優先順序比Expires高。

Cache-Control、Expires都是緩存到期時間,Cache-Control是相對值,Expires是絕對值,即再次發送請求時,如果時間沒到期,強制緩存生效。

註:在無法確定客戶端的時間是否與服務端的時間同步的情況下,Cache-Control相比於expires是更好的選擇,所以同時存在時,只有Cache-Control生效。

①協商緩存生效,返回304

②協商緩存失效,返回200和請求結果

這里我們以博客的請求為例,狀態碼為灰色的請求則代表使用了強制緩存,請求對應的Size值則代表該緩存存放的位置,分別為from memory cache 和 from disk cache。那麼from memory cache 和 from disk cache又分別代表的是什麼呢?什麼時候會使用from disk cache,什麼時候會使用from memory cache呢?

from memory cache代表使用 內存中的緩存 ,from disk cache則代表使用的是 硬碟中的緩存 ,

Ⅵ 靜態資源常用的一種緩存方式

http緩存分為強緩存和協商緩存。
強緩存並不會請求伺服器,同時響應碼會返回200。比如使用的配置cache-control:max-age=1200

在項目中緩存圖片等靜態資源常用的是協商緩存。
在第一次請求靜態資源的時候,伺服器會根據資源內容生成etag, 在響應頭里返回給瀏覽器,在下次請求的時候瀏覽器會在頭部配置If-None-Match,攜帶etag來向伺服器詢問資源是否發生改變。若是沒有發生改變會返回304,這樣瀏覽器就不會從伺服器重新獲取資源而是直接使用本地緩存。採用etag可以解決文件名沒有發生變化但是文件內容被修改的問題。

通常會跟cache-control: no-cache 在一起配合使用。no-cache是指瀏覽器可以緩存響應,但是必須要向原始伺服器提交驗證請求。

參考:
https://www.imperva.com/learn/performance/cache-control/
https://blog.csdn.net/aimeimeiTS/article/details/105731709
https://www.zoo.team/article/http-cache
https://imweb.io/topic/5795dcb6fb312541492eda8c
https://aotu.io/notes/2016/09/22/http-caching/index.html

Ⅶ 了解一下瀏覽器的協商緩存以及nginx如何配置

強緩存:瀏覽器不與服務端協商直接取瀏覽器緩存
協商緩存:瀏覽器會先向服巧嫌凳務器確認資源的有效性後才決定是從緩存中取資源還是重新獲取資源

HTTP協議的Cache -Control指定請求和響應遵循的緩存機制。在請求消息或響應消息中設置 Cache-Control並孝旅不會影響另一個消息處理過程中的緩存處理過程。
請求時的緩存指令包括: no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached等。
響應者昌消息中的指令包括: public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。

參考文章:

Ⅷ 瀏覽器緩存策略

瀏覽器緩存策略分為兩種 強緩存 (本地緩存) 和 協商緩存 (弱緩存)。
瀏覽器在發請求前,先檢查強緩存,若沒有需要的內容(未命中),則發起請求判斷是否需要用弱緩存。

強緩存 是不發起請求,直接使用緩存內的內容的。瀏覽器將 js 、 css 、 image 、 font-family 等存到內存(存小文件)或者磁碟(存大文件)中,下次用戶再訪問的時候就從內存中取,以便提升性能。
協商緩存 需要往後台發請求, 通過判斷來決定是使用協商緩存。如果請求內容沒發生變化,則請求返回304(伺服器收到請求,但內容無變化),瀏覽器就用緩存內的內容。

如果伺服器返回的響應標頭中包含 Expires (時間戳),那麼客戶端發起請求的時間在 Expires 之前的話,就觸發強緩存。

伺服器在上一次響應請求時,返回一個帶 Last-Modified 的響應頭,值為一個時間戳,表示該資源最後一次在伺服器修改的時間。當客戶端再一次請求這個資源的時候, 請求頭就會帶上 If-Modified-Since ,值為上次伺服器發來的 Last-Modified , 伺服器收到後,就和該資源最後修改時間比對, 沒變化就返回304, 觸發協商緩存。
弊端 : 時間間隔最小為1s,如果請求的資源在1s內發生了改變,是可能會觸發協商緩存的, 導致無法獲取到最新的資源。

為解決間隔最小1s的問題, If-None-Match 和 Etag 就誕生了。 Etag 是由伺服器世孫廳生成的, 是每個資源搜隱的唯一標識字元串, 隨資源變化而改變。 判斷過程和http1.0的一致,請求的時候攜帶 If-None-Match ,然後伺服器比較這兩個值,沒變化就返回304, 觸發協商緩存。
弊端凱銷 : 佔用伺服器資源較多, 雖然准確度高,但是性能上不如 Last-Modified & If-Modified-Since 的方法。不過實際的影響不會很大, 基本上可以忽略不計。

即便我們沒有配置緩存策略,瀏覽器也會採用自己的演算法來緩存資源。

Ⅸ 瀏覽器緩存機制

有dns的地方,就有緩存。瀏覽器、操作系統、Local DNS、根域名伺服器,它們都會對DNS結果做一定程度的緩存。

DNS查詢過程如下:

首先搜索瀏覽器自身的DNS緩存,如果存在,則域名解析到此完成。
如果瀏覽器自身的緩存裡面沒有找到對應的條目,那麼會嘗試讀取操作系統的hosts文件看是否存在對應的映射關系,如果存在,則域名解析到此完成。
如果本地hosts文件不存在映射關系,則查找本地DNS伺服器(ISP伺服器,或者自己手動設置的DNS伺服器),如果存在,域名到此解析完成。
如果本地DNS伺服器還沒找到的話,它就會向根伺服器發出請求,進行遞歸查詢。

瀏覽器本地緩存失效後,瀏覽器會向CDN邊緣節點發起請求。類似瀏覽器緩存,CDN邊緣節點也存在著一套緩存機制。CDN邊緣節點緩存策略因服務商不同而不同,但一般都會遵循http標准協議,通過http響應頭中的
Cache-control: max-age 的欄位來設置CDN邊緣節點數據緩存時間。

當瀏覽器向CDN節點請求數據時,CDN節點會判斷緩存數據是否過期,若緩存數據並沒有過期,則直接將緩存數據返回給客戶端;否則,CDN節點就會向伺服器發出回源請求,從伺服器拉取最新數據,更新本地緩存,並將最新數據返回給客戶端。 CDN服務商一般會提供基於文件後綴、目錄多個維度來指定CDN緩存時間,為用戶提供更精細化的緩存管理。

CDN 優勢
CDN節點解決了跨運營商和跨地域訪問的問題,訪問延時大大降低。
大部分請求在CDN邊緣節點完成,CDN起到了分流作用,減輕了源伺服器的負載。

http請求報文(request)
請求行
請求方法  空格  URL 空格  協議版本 回車符 換行符
請求頭(通用信息頭、請求頭、實體頭)
頭部欄位名 冒號  值  回車鍵 換行符
...
頭部欄位名 冒號  值  回車鍵 換行符
空行
回車符   換行符
實體主體(只有post請求有)
主體

http響應報文(response)
狀態行
協議版本  空格  狀態碼 空格  狀態碼描述 回車符 換行符
響應頭部
頭部欄位名 冒號  值   回車符 換行符
...
頭部欄位名 冒號  值   回車符 換行符
空行
回車符   換行符
響應正文
正文

瀏覽器初次向伺服器發起請求後拿到請求結果,會根據響應報文中HTTP頭的緩存標識,決定是否緩存返回的結果,是則將請求結果和緩存標識存入瀏覽器緩存中

瀏覽器每次發起請求,都會現在瀏覽器緩存中查找該請求的結果以及緩存標識
瀏覽器                瀏覽器緩存        伺服器

——————第一次發起http請求——————>

<——沒有該請求的緩存結果和緩存標識————

——————————————發起http請求——————————————>

<——————————返回該請求結果和緩存規則————————————

——將請求結果和緩存標識存入瀏覽器緩存——>

強制緩存就是向瀏覽器緩存查找結果,並根據該結果的緩存規則來決定是否使用該緩存結果的過程

強制緩存的情況分為三種:
1、不存在該緩存結果和緩存標識,強制緩存失效,直接向伺服器發起請求
2、存在該緩存結果和緩存標識,但結果已經失效,強制緩存失效,使用協商緩存
3、存在該緩存結果和緩存標識,且該結果沒有失效,強制緩存生效,直接返回該結果

控制強制緩存的欄位:Expires,Cache-Control

Expires 是 HTTP/1.0 控制緩存的欄位,值為伺服器返回該請求的結果緩存時間
即再次發送請求是,客戶端時間 小於 Expires的值,直接使用緩存結果

Cache-Control 是HTTP/1.1的規則,主要用於控制網頁緩存,主要取值為:
public:所有的內容都緩存(客戶端和代理伺服器都可以緩存)
private:所有內容只有客戶端可以緩存(默認值)
no-cache:客戶端緩存內容,但是是否使用緩存則需要經過協商緩存來驗證決定
no-store:即不使用強制緩存,也不使用協商緩存
max-age=xxx:緩存內容將在xxx秒後失效

Expires 是一個絕對值
Cache-Control 中 max-age 是相對值,解決了 Expires時期 服務端與客戶端 可能出現時間差的問題

註:Expires和Cache-Control同時存在時,只有Cache-Control生效

協商緩存就是強制緩存失效後,瀏覽器攜帶緩存標識向伺服器發起請求,由伺服器根據緩存標識決定是否使用緩存的過程

協商緩存的兩種情況:
1、協商緩存生效,返回304,繼續使用緩存
過程:
瀏覽器                 瀏覽器緩存     伺服器

————————發起http請求————————>

<——該請求的緩存結果失效,只返回緩存標識——

————————攜帶該資源的緩存標識,發起http請求————————>

<—————————————304,該資源無更新————————————

——————獲取該請求的緩存結果——————>

<——————返回該請求的緩存結果——————

2、協商緩存失敗,返回200和請求結果
過程:
瀏覽器                 瀏覽器緩存     伺服器

————————發起http請求————————>

<——該請求的緩存結果失效,只返回緩存標識——

————————攜帶該資源的緩存標識,發起http請求————————>

<————————200,資源已更新,重新返回請求和結果———————

——將該請求結果和緩存標識存入瀏覽器緩存中—>

協商緩存的標識也是在響應報文的HTTP頭中和請求結果一起返回給瀏覽器的

控制協商緩存的欄位:
(1) Last-Modified/If-Modified-Since:Last-Modified是伺服器響應請求是,返回該資源文件在伺服器最後被修改的時間;If-Modified-Since再次發起請求時,攜帶上次返回的Last-Modified的值,伺服器將該欄位值與該資源最後修改時間對比,決定是否用緩存
(2)Etag/If-None-Match:Etag伺服器響應請求時,返回當前資源文件的一個唯一標識,由伺服器生成之;If-None-Match是再次發起請求時,攜帶上次返回的唯一標識Etag的值,伺服器收到後,將該欄位值與該資源在伺服器上的Etag對比,一致 則返回304,否則返回200

註:Etag/If-None-Match優先順序高於Last-Modified/If-Modified-Since,同時存在時只有Etag/If-None-Match生效

瀏覽器緩存分為:內存緩存 和 硬碟緩存

內存緩存特性:
(1)快速讀取:內存緩存會將編譯解析後的文件,存入該進程的內存中,便於下次運行時快速讀取
(2)時效性:一旦關閉進程,進程內存清空

硬碟緩存特性:
永久性:直接寫入硬碟文件中
復雜、緩慢:讀取緩存對該緩存存放的硬碟文件進行I/O操作,重新解析

from memory cache:使用內存中的緩存

from disk cache:使用硬碟中的緩存

瀏覽器讀取順序:memory ——> disk

瀏覽器將js和圖片等文件解析執行後直接存入內存緩存中,F5刷新頁面時,from memory cache(使用內存中的緩存)
css文件存入硬碟中,F5刷新頁面時,from disk cache(使用硬碟中的緩存)

參考文章
https://segmentfault.com/a/1190000017962411
https://www.cnblogs.com/chengxs/p/10396066.html

Ⅹ 瀏覽器緩存和伺服器緩存

一、瀏覽器緩存

瀏覽器緩存即http緩存;瀏覽器緩存根據是否需要向伺服器重新發起HTTP請求將緩存過程分為兩個部分,分別是 強制緩存 和 協商緩存  。

瀏覽器第一次請求資源的時候伺服器會告訴客戶端是否應該緩存資源,根據響應報文中HTTP頭的緩存標識,決定是否緩存結果,是則將請求結果和緩存標識存入瀏覽器緩存中。如下圖:

1.強制緩存 :瀏覽器會對緩存進行查找,並根據一定的規則確定是否使用緩存。

強制緩存的緩存規則?

HTTP/1.0 Expires 這個欄位是絕對時間,比如2018年6月30日12:30,然後在這個時間點之前的請求都會使用瀏覽器緩存,除非清除了緩存。

這個欄位的缺點就是只會同步客戶端的時間,這就有可能修改客戶端時間導致緩存失效。

HTTP/1.1 cache-Control       這個是1.1的時候替換Expires的,它會有幾種取值:

public :所有內容都將被緩存(客戶端和代理伺服器都可緩存)

private :所有內容只有客戶端可以緩存, Cache-Control的默認取值

no-cache :客戶端緩存內容,但是是否使用緩存則需要經過協商緩存來驗證決定

no-store :所有內容都不會被緩存,即不使用強制緩存,也不使用協商緩存

max-age=xxx (xxx is numeric) :緩存內容將在xxx秒後失效

比如max-age=500,則在500秒內再次請求會直接只用緩存。

優先性:cache-Control > Expires

如果同時存在,cache-Control會覆蓋Expires。

這個欄位的缺點就是:

如果資源更新的速度是秒以下單位,那麼該緩存是不能被使用的,因為它的時間單位最低是秒。

如果文件是通過伺服器動態生成的,那麼該方法的更新時間永遠是生成的時間,盡管文件可能沒有變化,所以起不到緩存的作用。

上圖中瀏覽器緩存中存在該資源的緩存結果,並且沒有失效,就會直接使用緩存的內容。

上圖中瀏覽器緩存中沒有該資源的緩存結果和標識,就會直接向伺服器發起HTTP請求。

2.協商緩存: 瀏覽器的強制緩存失效後(時間過期),瀏覽器攜帶緩存標識請求伺服器,由伺服器決定是否使用緩存。

伺服器決定的規則?

控制協商緩存的欄位有 Last-Modified / If-Modified-Since 和 Etag / If-None-Match。

①Last-Modified 是伺服器返回給瀏覽器的本資源的最後修改時間。

當下次再次請求的時候,瀏覽器會在請求頭中帶 If-Modified-Since ,即上次請求下來的 Last-Modified 的值,

然後伺服器會用這個值和該資源最後修改的時間比較,如果最後修改時間大於這個值,則會重新請求該資源,返回狀態碼200。

如果這個值和最後修改時間相等,則會返回304,告訴瀏覽器繼續使用緩存。

② Etag 是伺服器返回的一個hash值。

當下次再次請求的時候,瀏覽器會在請求頭中帶 If-None-Match ,即上次請求下來的 Etag 值,

然後伺服器會用這個值和該資源在伺服器的 Etag 值比較,如果一致則會返回304,繼續使用緩存;如果不一致,則會重新請求,返回200。

二、伺服器緩存

上面是一個簡單的流程圖:

用戶1訪問A頁面,伺服器解析A頁面返回給用戶1,同時在伺服器內存上做一定映射,把A頁面緩存在硬碟上面

用戶2訪問A頁面,伺服器直接根據內存上的映射找到對應的頁面緩存,直接返回給用戶2,這樣就減少了伺服器對同一頁面的重復解析

伺服器緩存和瀏覽器緩存的區別:

伺服器緩存是把頁面緩存到伺服器上的硬碟里,而瀏覽器緩存是把頁面緩存到用戶自己的電腦里

Nginx伺服器 

Nginx是一個高性能的HTTP和反向代理伺服器。具有非常多的優越性:

在連接高並發的情況下,Nginx是Apache伺服器不錯的替代品,Nginx在美國是做虛擬主機生意的老闆們經常選擇的軟體平台之一。

Nginx提供了expires、etag、if-modified-since指令來實現瀏覽器緩存控制。

nginx -s reload#重新載入配置文件 

nginx -s reopen#重新打開log文件 

nginx -s stop#快速關閉nginx服務 

nginx -s quit #優雅的關閉nginx服務,等待工作進程處理完所有的請求

Nginx設置靜態文件的緩存過期時間 

location ~.*\.(js|css|html|png|jpg)$ {

  expires 3d;

}

 expires    3d;//表示緩存3天

expires    3h;//表示緩存3小時

expires    max;//表示緩存10年

expires    -1;//表示永遠過期。

如果設置為-1在js、css等靜態文件在沒有修改的情況下返回的是http 304,如果修改返回http 200

對於靜態資源會自動添加ETag,可以通過添加etag off指令禁止生成ETag。如果是靜態文件,那麼Last-Modified值為文件的最後修改時間。

在開發調試web的時候,經常會碰到因瀏覽器緩存(cache)而經常要去清空緩存或者強制刷新來測試的煩惱,提供下apache不緩存配置和nginx不緩存配置的設置。在常用的緩存設置裡面有兩種方式,都是使用add_header來設置:分別為Cache-Control和Pragma。

location ~ .*\.(css|js|swf|php|htm|html )$ {

  add_header Cache-Control no-store;

  add_header Pragma no-cache;

  }

nginx gzip壓縮

使用 gzip 壓縮可以降低網站帶寬消耗,同時提升訪問速度。

主要在nginx服務端將頁面進行壓縮,然後在瀏覽器端進行解壓和解析,

目前大多數流行的瀏覽器都遲滯gzip格式的壓縮,所以不用擔心。

默認情況下,Nginx的gzip壓縮是關閉的,同時,Nginx默認只對text/html進行壓縮

gzip on;

ersio #開啟gzip壓縮輸出

gzip_http_vn 1.0 ;#默認1.1

#其中的gzip_http_version的設置,它的默認值是1.1,就是說對HTTP/1.1協議的請求才會進行gzip壓縮

#如果我們使用了proxy_pass進行反向代理,那麼nginx和後端的upstream server之間是用HTTP/1.0協議通信的。

gzip_vary on ;

#和http頭有關系,加個vary頭,給代理伺服器用的,有的瀏覽器支持壓縮,有的不支持,

#所以避免浪費不支持的也壓縮,所以根據客戶端的HTTP頭來判斷,是否需要壓縮

gzip_comp_level 6;

#設置gzip壓縮等級,等級越底壓縮速度越快文件壓縮比越小,反之速度越慢文件壓縮比越大 1-9

gzip_proxied any;

#Ngnix作為反向代理的時候啟用

#expample:gzip_proxied no-cache;

# off – 關閉所有的代理結果數據壓縮

# expired – 啟用壓縮,如果header中包含」Expires」頭信息

# no-cache – 啟用壓縮,如果header中包含」Cache-Control:no-cache」頭信息

# no-store – 啟用壓縮,如果header中包含」Cache-Control:no-store」頭信息

# private – 啟用壓縮,如果header中包含」Cache-Control:private」頭信息

# no_last_modified – 啟用壓縮,如果header中包含」Last_Modified」頭信息

# no_etag – 啟用壓縮,如果header中包含「ETag」頭信息

# auth – 啟用壓縮,如果header中包含「Authorization」頭信息

# any – 無條件壓縮所有結果數據

gzip_types text/html ;#壓縮的文件類型

#設置需要壓縮的MIME類型,非設置值不進行壓縮

#param:text/html|application/x-javascript|text/css|application/xml

gzip_buffers 16 8k; #設置gzip申請內存的大小,其作用是按塊大小的倍數申請內存空間設置gzip申請內存的大小,其作用是按塊大小的倍數申請內存空間

#設置gzip申請內存的大小,其作用是按塊大小的倍數申請內存空間

# param1:int 增加的倍數

# param2:int(k) 後面單位是k

# example: gzip_buffers 4 8k;

# Disable gzip for certain browsers.

gzip_disable 「MSIE [1-6].(?!.*SV1)」; #ie6不支持gzip,需要禁用掉ie6