HTTP協議快取機制的應用

2021-09-23 21:25:19 字數 3368 閱讀 4127

快取的目 的是減少相應延遲 和 減少網路頻寬消耗, 比如cssjs、這類靜態資源應該進行快取。

實際專案 一般使用反向**伺服器(如nginxapache等) 進行快取。

關鍵字:

cache-control, expire, if-none-match, if-modified-since, etag, last-modified

請求處理過程:

當乙個使用者發起乙個靜態資源請求的時候,瀏覽器會通過以下幾步來獲取資源

1.本地快取階段:先在本地查詢該資源,如果有發現該資源,而且該資源還沒有過期,就使用這乙個資源,完全不會傳送http請求到伺服器

2.協商快取階段:如果在本地快取找到對應的資源,但是不知道該資源是否過期或者已經過期, 則發乙個http請求到伺服器,然後伺服器判斷這個請求,如果請求的資源在伺服器上沒有改動過,則返回304, 讓瀏覽器使用本地找到的那個資源

3.快取失敗階段:當伺服器發現請求的資源已經修改過,或者這是乙個新的請求(在本來沒有找到資源),伺服器則返回該資源的資料,並且返回200, 當然這個是指找到資源的情況下,如果伺服器上沒有這個資源,則返回404

經過上面的流程整理,我們會有以下幾個問題需要處理.

1.本地快取階段,如何判斷資源在本地是否過期?

2.協商快取階段,如何判斷本地資源是否和伺服器的資源是否一樣?

expire:

如果apache開啟了expire模組, 當瀏覽器傳送該資源請求的時候, apache返回資源的同時,會返回乙個名為expire的http頭,expire頭的內容是乙個時間值, 這乙個值就是資源在本地的過期時間, 這個值會存在本地.

也就是說,在本地快取階段,在本地找到了乙個對應的資源值,而且當前時間還沒超過資源的過期時間, 那麼就直接使用這乙個資源,不會傳送http請求.

cache-control:

cache-control是http協議中常用的頭部之一,顧名思義, 他是負責控制頁面的快取機制,如果該頭部指示快取, 快取的內容也會存在本地, 操作流程和expire相似,但也有不同的地方, cache-control有更多的選項, 而且也有更多的處理方式.

該頭部有過個值,下面我們來看下各個值的作用

1.public

指示響應可被任何快取區快取。

2.private

指示對於單個使用者的整個或部分響應訊息,不能被共享快取處理。這允許伺服器僅僅描述當使用者的部分響應訊息,此響應訊息對於其他使用者的請求無效。

3.no-cache

指示請求或響應訊息不能快取

4.no-store

用於防止重要的資訊被無意的發布。在請求訊息中傳送將使得請求和響應訊息都不使用快取

5.max-age

指示客戶機可以接收生存期不大於指定時間(以秒為單位)的響應。

6.no-transform

不允許轉換儲存系統

7.must-revalidate

使得客戶端再次瀏覽當前頁時必須傳送相關 http 頭資訊到伺服器進行驗證,然後才決定是否載入客戶端本地 cache

if-modified-since 和 last-modified:

當apache接收到乙個資源請求(假設是使用者是第一次訪問,沒有任何快取), 伺服器返回資源的同時,還會傳送乙個last-modified的http響應頭, last-modified響應頭的內容值是該資源在伺服器上最後修改的時間.瀏覽器接受到這個http頭後,會

把其內容值和資源同時儲存起來.

當使用者第二傳送資源請求(假設這裡expire沒有生效或者已經過期), 瀏覽器在本地找到了乙個相同的資源,但是不能確定該資源是否和伺服器上的一樣(有可能在兩次訪問期間,伺服器上的資源已經被修改過),此時瀏覽器傳送請求的時候,請求頭內會

附帶乙個if-modified-since的請求頭, 這個頭部的內容就是上一次last-modified返回的值, 伺服器把這個頭的值和請求資源的最後修改時間對比,如果兩個值相同,則認為資源沒有修改,將會返回304,讓瀏覽器使用本地資源.否則伺服器將返回資源,而且

返回200狀態

if-none-match 和 etag:

其實這兩個頭部和if-modified-since, last-modified的工作原理是一樣的, if-none-match作為請求頭, etag作為響應頭.既然工作原理一樣, 為什麼etag這對頭部會出現呢?

原因在於, last-modified請求頭的內容是以檔案最後修改的時間作為對比的,但是unix系統裡面, 檔案修改的時間只儲存到了秒. 如果某些應用內存在1秒內對檔案做了多次修改,這樣last-modified是不能完成比較功能的.所以要引入乙個新的機制(原因可能不止這乙個);

etag的值一般由3個數值組成,資源的inode值, 最後修改時間, 資源大小,以16進製制組成乙個字串, 例如:1a-182b-10f; 但這個格式不是固定的, 只要保證該值的唯一性,但不限格式.

瀏覽器中的操作對快取的影響:

1.強制重新整理 – 當按下ctrl+f5來重新整理頁面的時候, 瀏覽器將繞過各種快取(本地快取和協商快取), 直接讓伺服器返回最新的資源;

2.普通重新整理 – 當按下f5來重新整理頁面的時候,瀏覽器將繞過本地緩蹲來傳送請求到伺服器, 此時, 協商快取是有效的

3.回車或轉向 – 當在位址列上輸入回車或者按下跳轉按鈕的時候, 所有快取都生效

cache-control 和 expire:

1.兩者都是控制本地快取的頭部兩者同時存在的時候

2.expire會被cache-control的max-age覆蓋

3.expire的值是乙個確定的日期, 而max-age的值是乙個以秒為單位的數字訪問, 表示生存時間.

4.expire只針對靜態資源, 而cache-control針對所有頁面,但預設為所有的動態頁面不快取(例如php頁面).

pragma 和 cache-control:

pragma是http/1.0實現的頭部, pragma的值會出現在頁面meta標籤的http-equiv屬性中,以此來控制頁面快取

cache-control是http/1.1實現的頭部,在http/1.0下不相容.

if-modified-since 和 if-none-match的優先順序:

伺服器會優先驗證if-modified-since請求頭,再驗證if-none-match,但是必須要兩者頭通過驗證的時候才返回304,其中乙個驗證失敗,都將返回新資源和200狀態;

HTTP 協議快取機制

瀏覽器 http 協議快取機制詳解 收藏 xrzs 破譯 粽 子 拿最高懸賞!最近在準備優化日誌請求時遇到了一些令人疑惑的問題,比如為什麼響應頭里出現了兩個 cache control 為什麼明明設定了 no cache 卻還是發請求,為什麼多次訪問時有時請求裡帶了 etag,有時又沒有帶?等等。後...

HTTP協議與網路程式設計(三)HTTP快取機制

快取是一種儲存資源副本並在下次請求時直接使用該副本的技術 快取需要合理配置,並不是所有的資源都是永久不變的,他是有生命週期的 不能快取過期的資源 1 無快取機制 2 快取機制優勢 常見的http快取只能儲存get響應 只能用於單獨使用者 cache control private可以被多個使用者使用...

Http快取機制

快取快取,就是把需要的東西存起來,不需要每次都去請求。主要目的減小伺服器壓力,放到客戶端上來講,還利於節省流量,還能流暢的把ui顯示出來,提高了使用者體驗。對於http快取來講,主要的就是校驗快取的有效性,也就是新鮮度。如果客戶端不能及時響應服務端的資料變化,快取一直不能被更新,那不就是得不償失了?...