UrlRewriter 緩存問題及一系列的相關(guān)探索

在開發(fā)一個網(wǎng)站功能時,由于session 緩存不能及時清除。開始了一系列的探索。
現(xiàn)找到幾篇不錯的文章。
首先是 F5和 CTRL+F5的區(qū)別
F5和CTRL+F5的區(qū)別(留給比較懶的人 :F5是優(yōu)先讀取緩存但框架內(nèi)只讀取本地緩存 。CTRL+F5發(fā)起一次新的請求,跳過緩存)
背景
我司的網(wǎng)站是框架結(jié)構(gòu)的,一個頁面里有多個iframe.正因為這個原因,每次當我自信滿滿的把修改過的JS文件提交到SVN上后,沒過多久,某個 后臺程序員就會來找我說:怎么JS還報錯呢,我已經(jīng)CTRL+F5了啊,你提交對了嗎.我只好到他座位上拿起鼠標進行操作:右鍵->本幀-> 在新標簽中打開新幀->CTRL+F5->切換到原標簽->F5.這一番操作之后,終于對了.同樣的事情已經(jīng)發(fā)生過很多次了.這也證明 了不少程序員同志還是不夠了解瀏覽器的緩存機制.
基礎(chǔ)知識
問題的根本原因就是,在火狐里,CTRL+F5清除不了框架頁面的緩存.包括框架頁面本身和其所有的嵌入元素(.js,.css,.jpg等).所以本文的真正標題是"Firefox中如何才能跳過緩存刷新框架內(nèi)的頁面".首先我要講一下相關(guān)的基礎(chǔ)知識.
一.讀取緩存
搞WEB開發(fā)的經(jīng)常會說:有緩存,CTRL+F5一下.或者:有緩存,CTRL+SHIFT+DEL清一下.那么你知道瀏覽器有幾種方式來讀取緩存文件嗎.從是否發(fā)送了HTTP請求來區(qū)分,我覺的可以分兩種:
1.瀏覽器從服務(wù)器返回的過期時間判斷得出,該文件還沒有過期,所以直接從緩存文件夾讀取緩存文件,顯示網(wǎng)頁,并沒有走任何網(wǎng)絡(luò)連接.
2.瀏覽器發(fā)送HTTP請求,請求頭中包含了If-Modified-Since 和 If-None-Match字段.讓服務(wù)器來判斷是否應(yīng)該讀取緩存文件.如果服務(wù)器返回304響應(yīng),無響應(yīng)實體,表示服務(wù)器認為這個文件沒有變化.可以使 用緩存中的對應(yīng)文件,這時瀏覽器才會讀取緩存.(如果不了解HTTP,可以買本<<HTTP權(quán)威指南>>看看.或者直接RFC2616)
我把第一種讀取緩存的方式稱之為"無請求讀取緩存",第二種方式稱之為"無修改讀取緩存".
二.刷新方式
這里的刷新方式是指能通過哪些方式讓一個網(wǎng)頁重新加載,我從表現(xiàn)上大概分了三種:
1.最常用的,點擊瀏覽器的刷新按鈕,或者按下F5
2.CTRL+F5,功能是跳過緩存刷新
3.瀏覽器地址欄上回車,IE里把這種請求方式歸為"導(dǎo)航"操作
在讀取緩存方面,這三種刷新方式的表現(xiàn)都不一樣.第三種方式的表現(xiàn)通常是只刷新主頁面文件,其他內(nèi)嵌文件全部"無請求讀取緩存".大部分開發(fā)者都不會這么刷新頁面,所以本次試驗不對比這種刷新方式.
三.F5和CTRL+F5的區(qū)別
本文的試驗部分只針對F5和CTRL+F5兩種刷新方式做對比.這里講一下為什么F5不能跳過緩存,而后者可以.答案就是發(fā)送的請求頭不一樣.而且不同的瀏覽器發(fā)送的請求頭也有一些區(qū)別.
1.F5觸發(fā)的HTTP請求的請求頭中通常包含了If-Modified-Since 或 If-None-Match字段,或者兩者兼有.如果服務(wù)器認為被請求的文件沒有發(fā)生變化,則返回304響應(yīng),也就沒有跳過緩存.
2.CTRL+F5觸發(fā)的HTTP請求的請求頭中沒有上面的那兩個頭,卻有Pragma: no-cache 或 Cache-Control: no-cache 字段,或者兩者兼有.服務(wù)器看到no-cache這樣的值就會把最新的文件響應(yīng)過去.也就跳過了緩存.
試驗對比
試驗題目為:使用F5和CTRL+F5在包含iframe的頁面上進行刷新操作,五大瀏覽器各自的表現(xiàn)不同.本次試驗使用Fiddler監(jiān)測網(wǎng)絡(luò)請求,而且不考慮緩存相關(guān)的HTTP響應(yīng)頭的影響.
主頁面index.html源碼為
<!DOCTYPE
HTML>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<iframe src="frame.html"></iframe>
<img src="index.jpg" />
<script src="index.js"></script>
</body>
</html>
框架頁面frame.html源碼為
<!DOCTYPE
HTML>
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<img src="frame.jpg" />
<script src="frame.js"></script>
</body>
</html>
一.IE 9
序號1-6的請求為F5的操作,序號7-12的請求為CTRL+F5的操作.可見,在IE下,使用CTRL+F5能讓主頁面和框架頁面的所有資源文件都跳過緩存.
二.Firefox 18
序號1-6的請求為F5的操作,序號7-9的請求為CTRL+F5的操作.可見,在Firefox下,使用CTRL+F5只能讓主頁面及其資源文件跳過緩存,而框架頁面及其資源文件完全"無請求讀取緩存".
三.chrome 22
序號1-5的請求為F5的操作,序號7-9的請求為CTRL+F5的操作.可見,在Chrome下,和Firefox類似,使用CTRL+F5只能 讓主頁面及其資源文件跳過緩存,而框架頁面及其資源文件完全"無請求讀取緩存".詭異的是,如果在當前頁面按過一次CTRL+F5,則每次在該頁面按下 F5的時候,主頁面的HTTP請求中都會加入一個Pragma: no-cache請求頭,也就是說,瀏覽器會記憶.序號1的請求就是這種情況.更詭異的是,F5操作下,frame.html始終是"無請求讀取緩存", 這和其他瀏覽器表現(xiàn)不一樣.更麻煩的是,chrome不能用右鍵把框架頁面提出來.
四.Opera 12.50
序號1-6的請求為F5的操作,序號7-12的請求為CTRL+F5的操作.可見,在Opera下,表現(xiàn)更加不一樣.即使只按F5,主頁面的請求 (序號1)也有Pragma: no-cache請求頭,CTRL+F5下,除了框架頁面本身(序號8),所有的資源文件都跳過了緩存.這一點比較接近IE
五.Safari
序號1-5的請求為F5的操作,Safari不支持CTRL+F5.和Opera類似.F5會讓主頁面的請求(序號1)中包含Pragma: no-cache請求頭.既然不支持跳過緩存,那么不管是不是框架頁面,在Safari中只能點菜單清除緩存了.
解決辦法
根據(jù)以上對比可以看出,只有IE瀏覽器的表現(xiàn)是我們想要的.這里給出Firefox下的解決辦法.
1.安裝擴展
//img.jbzj.com/file_images/article/201301/2013124142805092/ReloadPassCache_jb51.rar
2.安裝UC腳本
//img.jbzj.com/file_images/article/201301/2013124142805092/ReloadPassCache.uc.js
UC腳本是專業(yè)的火狐玩家使用的,這里順便講一下我是如何實現(xiàn)這個功能的.有興趣玩火狐腳本的可以看一下.實在看不懂可以跳過.
//在瀏覽器主窗口綁定keydown事件
location
== "chrome://browser/content/browser.xul" &&
addEventListener("keydown",
function (event)
{
//如果按下了CTRL+F5
if (event.which
=== 116 && event.ctrlKey) {
//阻止冒泡和默認操作,主要是阻止默認的刷新動作.否則會刷兩次
event.preventDefault();
event.stopPropagation();
(function (content)
{
//為當前標簽綁上DOMContentLoaded事件,在主頁面DOM加載完成后,刷新各個框架
gBrowser.mCurrentBrowser.addEventListener("DOMContentLoaded",
function self()
{
//解綁DOMContentLoaded事件
this.removeEventListener("DOMContentLoaded",
self, false);
//遍歷刷新所有框架
Array.prototype.slice.call(content.frames).forEach(function (win)
{
//跳過緩存刷新
win.location.reload(true);
})
},
false);
//開始刷新主頁面
content.location.reload(true);
})(content)
}
//捕獲模式,第一時間觸發(fā)事件處理函數(shù).
},
true)
安裝該擴展后,按下CTRL+F5能像IE一樣,讓所有的框架頁面全都跳過緩存刷新.至于多層框架(框架中的框架),這個擴展不適用,我覺的各位程序員不會那么倒霉.
UrlReriter
什么是偽靜態(tài)? 1.是通過正則映射把本是動態(tài)的頁面轉(zhuǎn)成
看起來
是靜態(tài)的頁面為什么用偽靜態(tài)? 1.瀏覽器不收錄帶'?' url 2.打開一個頁面后(url 完全相同),再次打開會很快。因為轉(zhuǎn)換頁面是在內(nèi)存中完成的,如果再次打開同一個頁面,就不會再轉(zhuǎn)換,而是直接在內(nèi)存中讀取?,F(xiàn)在每轉(zhuǎn)一個頁面都換 url, 內(nèi)存使用情況,自己考慮一下。。 3.cup 資源占用少(參考上一條) 4.看起來比較統(tǒng)一,能隱藏開發(fā)使用的語言什么情況下使用偽靜態(tài)? 1.小型網(wǎng)站和特別在意瀏覽器收錄的網(wǎng)站才使用(內(nèi)容不經(jīng)常換,又希望別人通過 搜索引擎能找到) 2.門戶網(wǎng)站選擇性的用,社區(qū)能不用就不用
相關(guān)文章
15 個為編程初學(xué)者準備的網(wǎng)站(都是國外的一些網(wǎng)站)
今天的文章,我們將分享15個可以學(xué)習(xí)編程的網(wǎng)站,這些網(wǎng)站上提供了很多編程教程,圖書以及編程練習(xí),希望對你有用2024-11-02- 這篇文章主要介紹了web開發(fā)中的長度單位主要包括px,pt,em等,需要的朋友可以參考下2023-08-06
網(wǎng)頁前端開發(fā)的一些尺寸單位(px,rem單位)
px單位是絕對單位,一般用于pc端網(wǎng)頁開發(fā),因為是絕對單位所以在移動端上的使用體驗并不是很好,rem它是描述相對于當前根元素字體尺寸,是相對單位,它可以根據(jù)根元素的變換而2023-08-06WEB前端優(yōu)化必備js/css壓縮工具YUI-compressor詳解與集成用法
壓縮工具層次不窮,各有優(yōu)點,選擇適合的壓縮工具為將來做項目開發(fā)使用是一件很重要的事情??!在這介紹YUI-compressor,需要的朋友可以參考下2023-06-21- 瀏覽器是多進程的,有瀏覽器主進程,網(wǎng)絡(luò)進程,渲染進程,插件進程等,在將html,css,javascript解析成一個頁面的時候,就需要多個進程的分工合作2023-05-01
- 本文為大家整理了常用的文件對應(yīng)的MIME類型,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-25
postman中form-data、x-www-form-urlencoded、raw、binary的區(qū)別介紹
這篇文章介紹了postman中form-data、x-www-form-urlencoded、raw、binary的區(qū)別,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-28網(wǎng)頁中使用Unicode字符的介紹(&#,\u等)
國際組織制定了可以容納世界上所有文字和符號的字符編碼方案,稱為Unicode,是通用字符集Universal Character Set的縮寫,用以滿足跨語言、跨平臺進行文本轉(zhuǎn)換、處理的要求2021-11-27前端實現(xiàn)字符串GBK與GB2312的編解碼(小結(jié))
這篇文章主要介紹了前端實現(xiàn)字符串GBK與GB2312的編解碼(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2020-12-02- 這篇文章主要介紹了告別硬編碼讓你的前端表格自動計算,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-27