我思故我強(qiáng)

          導(dǎo)航

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          統(tǒng)計

          公告

          公告


          本博客在此聲明:
          所有文章均為轉(zhuǎn)摘
          只做資料收集使用

          常用鏈接

          留言簿(1)

          文章分類(196)

          文章檔案(164)

          相冊

          我收藏的網(wǎng)址

          搜索

          積分與排名

          最新評論

          使用瀏覽器Cache和http狀態(tài)碼304實(shí)現(xiàn)的客戶端緩存

          Cache就是瀏覽器的緩存技術(shù),大家肯定不陌生,瀏覽器在每次加載一個文件的時候,都要去自己的緩存文件夾里面去查找是否存在可用緩存,如果存在,則不再去服務(wù)器下載而直接使用本地內(nèi)容,這是一個很好的節(jié)省服務(wù)器性能和流量的方式,在網(wǎng)站不做任何設(shè)置的情況下,瀏覽器會根據(jù)用戶的設(shè)置來確定是否使用緩存,可見瀏覽器的“Internet選項(xiàng)”的“瀏覽歷史紀(jì)錄”的“設(shè)置”部分。

            通常來講,Cache設(shè)置有兩種方式:第一種是在HTML內(nèi)容的head之中設(shè)置:

            <meta  http-equiv="Expires"  CONTENT="0">  //這一句設(shè)置文件的過期時間為0秒

            <meta  http-equiv="Cache-Control"  CONTENT="no-cache">  //這一句設(shè)置文件禁止被緩存

            第二種是通過HTTP Head來設(shè)置,例如在.NET(C#)之中:

            Response.Cache.SetExpires(time);//設(shè)置文件的過期時間為當(dāng)前的時間。

            我個人比較喜歡通過HTTP HEAD這種方式來設(shè)置,因?yàn)槲矣X得這不屬于HTML本身的內(nèi)容,當(dāng)然,如果是靜態(tài)文件,就只能通過html head來設(shè)置了,在我的網(wǎng)站"地名信息系統(tǒng)"之中,我設(shè)置了每個HTML頁面在7天后失效,因?yàn)樵揌TML是自動生成的。

            在上面的Cache介紹之中,提到了瀏覽器在存在緩存的時候不去服務(wù)器取相關(guān)的內(nèi)容,可是僅僅這樣設(shè)置,好像有時候這些瀏覽器還是去服務(wù)器請求,有些時候的請求很合理,例如用戶點(diǎn)擊“刷新”按鈕的時候,有些時候我也不知道為什么,因此,我在系統(tǒng)之中進(jìn)一步使用了HTTP狀態(tài)碼。

            HTTP狀態(tài)碼有很多用戶不愿意去了解,其實(shí)這是很重要的內(nèi)容,至于怎么個重要法,以及詳細(xì)的使用說明請大家去參考相關(guān)的文檔,我這里舉幾個例子:

            1.有的用戶在網(wǎng)站頁面不存在的時候顯示了自己定義的頁面,可是忘記使用404狀態(tài)碼,這樣瀏覽器就不知道它下載的內(nèi)容究竟是正常內(nèi)容還是頁面不存在的提示,可能用戶能從頁面內(nèi)容上分辨出來,可是搜索引擎的機(jī)器人不會,因此就可能會被搜索引擎列入“無法檢索”的黑名單。

            2.在頁面轉(zhuǎn)向的時候不使用301或者302的狀態(tài)碼,造成搜索引擎不知道葉面已經(jīng)被轉(zhuǎn)向。

            我專門要說的304是一個用處和Cache相同的東西,這個狀態(tài)碼的含義是“服務(wù)器端沒有更新”,也就是說客戶端的文件版本是最新的,他的用法是這樣的:

            1.當(dāng)用戶首次請求該文件的時候,通過HTTP HEAD的Last-Modified字段將該文件的最后修改日期發(fā)送到客戶端,讓客戶端知道該文件的版本,例如:

            Last-Modified: Tue, 08 Apr 2008 14:48:05 GMT

            2.在瀏覽器再次請求該文件的時候,會自動將該時間作為請求的HTTP HEAD的If-Modified-Since字段內(nèi)容(有時候根據(jù)瀏覽器的不同,可能會用逗號隔開附加上文件的字節(jié)數(shù)大小),例如:

            If-Modified-Since: Tue, 08 Apr 2008 14:48:05 GMT

            3.服務(wù)端根據(jù)If-Modified-Since字段的內(nèi)容(如果存在該字段)來判斷客戶端的文件是否已經(jīng)過期,如果已經(jīng)過期,則重新返回新的文件,如果沒有,則只需要返回304狀態(tài)碼,就可結(jié)束輸出,這樣代表瀏覽器端的文件版本是最新的,不需要返回文件內(nèi)容。

            要知道,服務(wù)器返回一個304的時間要比返回整個文件的時間要小得多,性能損耗和網(wǎng)絡(luò)占用也小得多。

            Cache和304技術(shù)有一定的重復(fù),我選擇Cache和304技術(shù)一起使用是因?yàn)閱斡肅ache好像瀏覽器有時候還是去取最新內(nèi)容(尤其是用戶點(diǎn)擊刷新按鈕的時候),而單獨(dú)使用304則在瀏覽器向服務(wù)器詢問的過程還是會占用一定的性能和時間。這兩種技術(shù)結(jié)合起來使用是剛剛好的。

          posted on 2009-05-21 11:45 李云澤 閱讀(5122) 評論(1)  編輯  收藏 所屬分類: 軟件設(shè)計

          評論

          # re: 使用瀏覽器Cache和http狀態(tài)碼304實(shí)現(xiàn)的客戶端緩存 2013-11-01 15:09 趙成并

          您好。我實(shí)現(xiàn)了一個策略。服務(wù)器端返回304,但是由于客戶端用戶的操作頁面內(nèi)容已經(jīng)有所變化,客戶端設(shè)置了緩存。firefox下面刷新頁面就會看到一個空白頁面,沒有內(nèi)容。可能cache已經(jīng)被清空了。但是在chrome上面完全正常。 請問樓主,這可能是哪里處理問題??  回復(fù)  更多評論   

          主站蜘蛛池模板: 长沙县| 谢通门县| 九台市| 淅川县| 鄂托克旗| 金湖县| 岗巴县| 定远县| 甘肃省| 彩票| 通河县| 兰溪市| 德州市| 施甸县| 宜春市| 上高县| 突泉县| 新巴尔虎左旗| 新昌县| 高邑县| 阳高县| 明星| 鹤岗市| 榆林市| 安龙县| 蒙城县| 灵武市| 宜宾县| 大安市| 榆林市| 正蓝旗| 辛集市| 临邑县| 玉树县| 遂昌县| 蒙山县| 马关县| 酉阳| 中宁县| 沁源县| 昌江|