摘要:所以,如何確定這些資源沒有發生變更如何控制緩存過期的時間成了必須解決的問題。瀏覽器接收到響應后,會記錄這些信息,方便之后的緩存控制。也就是說,就算服務器端該資源已經發生變化,只要緩存未過期,就不會重新請求資源,所以刷新的作用就體現出來了。
前幾天按照Node.js中文社區上的教程,用Node.js搭了一個簡單的靜態文件服務器,其中有一個功能是提供緩存支持,在實踐這一部分的過程中,我重新學習了緩存的相關知識,在這里作簡單的梳理。
關于緩存的相關介紹,網上有不少文章,這里推薦三篇我認為不錯的文章:
http://blog.csdn.net/eroswang/article/details/8302191
http://www.oschina.net/news/41397/web-cache-knowledge
http://cloudbbs.org/forum.php?mod=viewthread&tid=15790
緩存是什么,簡單的說,就是訪問頁面時不需要重新請求瀏覽器已經緩存的資源(如圖片、css、js等),前提是這些位于服務器的資源并沒有發生變更。所以,如何確定這些資源沒有發生變更、如何控制緩存過期的時間成了必須解決的問題。這些內容在以上三篇文章中都有詳細的介紹,我這里僅從四種使用情景來分析瀏覽器和服務器的交互過程。
情景一:用戶第一次在瀏覽器中輸入網址,或者通過鏈接訪問某個網站
瀏覽器(客戶端)發出請求,請求網頁上的所有資源,一個資源對應一個請求,服務器端收到請求后,向客戶端發送200的狀態碼,表示該資源請求成功,并返回響應頭(response header)和數據體。其中,響應頭包含了以下幾個重要的頭信息:
last-modified:該資源(文件)的最后修改時間,為UTC格式
Expires:該資源的緩存過期時間,為絕對時間,即過了這個指定時間后緩存失效,為UTC格式
Cache-Control:通常通過max-age指定緩存過期時間,為相對時間,表示某次請求成功后多少秒內緩存可用,單位為秒
Cache-Control的出現是因為服務器端的時間可能存在誤差,其優先級高于Expires。瀏覽器接收到響應后,會記錄這些信息,方便之后的緩存控制。
情景二:用戶第N次(N大于1)在瀏覽器中輸入網址,或者通過鏈接訪問某個網站
瀏覽器首先檢查待請求的資源的狀態,先檢查Cache-Control,沒有則檢查Expires,如果緩存未過期,則瀏覽器不向服務器端發送請求,直接返回200 from cache,表明是從緩存中獲取的資源。也就是說,就算服務器端該資源已經發生變化,只要緩存未過期,就不會重新請求資源,所以刷新的作用就體現出來了。
情景三:資源已經緩存,用戶刷新頁面(按F5)
瀏覽器向服務器發送資源請求,請求頭中包含以下兩個頭信息:
Cache-Control:其中max-age=0(刷新時置為0),表示本地緩存已過期,要向服務器確認
if-modified-since:這是時間等于上一次成功請求該資源后從last-modified獲取的時間,為UTC格式
服務器接收到請求,將待請求資源的最后一次修改時間和if-modified-since進行對比。如果前者與后者不相等,則說明文件已經變動,則重新下載該資源,并返回200狀態碼;如果前者與后者相等,則從本地緩存中獲取,并返回304 Not Modified。
情景四:資源已經緩存,用戶強制刷新頁面(按Ctrl + F5)
強制刷新時,請求頭中的Cache-Control的值設為no-cache,表示強制發送請求,此外請求頭中無If-Modified-Since頭信息,這樣,無論緩存是否過期,無論服務器端文件是否發生變更,都會強制下載請求的資源,這就是所謂的“強制刷新”。
最后,附上用node.js實現靜態文件服務器的教程:
用NodeJS打造你的靜態文件服務器
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/61758.html
摘要:演員表角色名稱扮演者小劉瀏覽器小李普通用戶小川傳輸層快遞小哥小汪網絡層老四目標服務器比特大叔電流 ??小劉(瀏覽器)是一個批發商, 小李(普通用戶)是一個超市的進貨經理,一天小李經理來到了小劉老板的店鋪,說:我‘要(www.baidu.com)類的所有東西’,小劉老板說:‘我得用我們的行話(IP)告訴底下的人你要的東西他才知道你要啥’,小劉老板從身上掏出一個本本(瀏覽器緩存的DNS),...
摘要:為何不設置頭的時候默認輸出如下的緩存頭呢答案來自這是用于嘗試禁用瀏覽器緩存請求的這個日期是這個塊代碼開發者的生日那么問題來了把個人的事情帶到項目中來真的好嗎以后看到就可以認為這程序是寫的啦有意思的是也是有這頭的 為何PHP不設置Expires頭的時候, 默認輸出如下的緩存頭呢?: Expires: Thu, 19 Nov 1981 08:52:00 GMT 答案來自stac...
閱讀 3619·2021-09-27 14:02
閱讀 1769·2019-08-30 15:56
閱讀 1737·2019-08-29 18:44
閱讀 3269·2019-08-29 17:21
閱讀 477·2019-08-26 17:15
閱讀 1169·2019-08-26 13:57
閱讀 1234·2019-08-26 13:56
閱讀 2874·2019-08-26 11:30