UrlRewriter 缓存问题及一系列的相关探索

所属分类: 网页制作 / 应用技巧 阅读数: 1183
收藏 0 赞 0 分享

在开发一个网站功能时,由于session 缓存不能及时清除。开始了一系列的探索。

现找到几篇不错的文章。

首先是 F5和 CTRL+F5的区别

F5和CTRL+F5的区别
(留给比较懒的人 :F5是优先读取缓存但框架内只读取本地缓存 。CTRL+F5发起一次新的请求,跳过缓存)

背景

我司的网站是框架结构的,一个页面里有多个iframe.正因为这个原因,每次当我自信满满的把修改过的JS文件提交到SVN上后,没过多久,某个 后台程序员就会来找我说:怎么JS还报错呢,我已经CTRL+F5了啊,你提交对了吗.我只好到他座位上拿起鼠标进行操作:右键->本帧-> 在新标签中打开新帧->CTRL+F5->切换到原标签->F5.这一番操作之后,终于对了.同样的事情已经发生过很多次了.这也证明 了不少程序员同志还是不够了解浏览器的缓存机制.

基础知识

问题的根本原因就是,在火狐里,CTRL+F5清除不了框架页面的缓存.包括框架页面本身和其所有的嵌入元素(.js,.css,.jpg等).所以本文的真正标题是"Firefox中如何才能跳过缓存刷新框架内的页面".首先我要讲一下相关的基础知识.

一.读取缓存

搞WEB开发的经常会说:有缓存,CTRL+F5一下.或者:有缓存,CTRL+SHIFT+DEL清一下.那么你知道浏览器有几种方式来读取缓存文件吗.从是否发送了HTTP请求来区分,我觉的可以分两种:

1.浏览器从服务器返回的过期时间判断得出,该文件还没有过期,所以直接从缓存文件夹读取缓存文件,显示网页,并没有走任何网络连接.

2.浏览器发送HTTP请求,请求头中包含了If-Modified-Since 和 If-None-Match字段.让服务器来判断是否应该读取缓存文件.如果服务器返回304响应,无响应实体,表示服务器认为这个文件没有变化.可以使 用缓存中的对应文件,这时浏览器才会读取缓存.(如果不了解HTTP,可以买本<<HTTP权威指南>>看看.或者直接RFC2616)

我把第一种读取缓存的方式称之为"无请求读取缓存",第二种方式称之为"无修改读取缓存".

二.刷新方式

这里的刷新方式是指能通过哪些方式让一个网页重新加载,我从表现上大概分了三种:

1.最常用的,点击浏览器的刷新按钮,或者按下F5

2.CTRL+F5,功能是跳过缓存刷新

3.浏览器地址栏上回车,IE里把这种请求方式归为"导航"操作

在读取缓存方面,这三种刷新方式的表现都不一样.第三种方式的表现通常是只刷新主页面文件,其他内嵌文件全部"无请求读取缓存".大部分开发者都不会这么刷新页面,所以本次试验不对比这种刷新方式.

三.F5和CTRL+F5的区别

本文的试验部分只针对F5和CTRL+F5两种刷新方式做对比.这里讲一下为什么F5不能跳过缓存,而后者可以.答案就是发送的请求头不一样.而且不同的浏览器发送的请求头也有一些区别.

1.F5触发的HTTP请求的请求头中通常包含了If-Modified-Since 或 If-None-Match字段,或者两者兼有.如果服务器认为被请求的文件没有发生变化,则返回304响应,也就没有跳过缓存.

2.CTRL+F5触发的HTTP请求的请求头中没有上面的那两个头,却有Pragma: no-cache 或 Cache-Control: no-cache 字段,或者两者兼有.服务器看到no-cache这样的值就会把最新的文件响应过去.也就跳过了缓存.

试验对比

试验题目为:使用F5和CTRL+F5在包含iframe的页面上进行刷新操作,五大浏览器各自的表现不同.本次试验使用Fiddler监测网络请求,而且不考虑缓存相关的HTTP响应头的影响.

主页面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始终是"无请求读取缓存", 这和其他浏览器表现不一样.更麻烦的是,chrome不能用右键把框架页面提出来.

四.Opera 12.50

序号1-6的请求为F5的操作,序号7-12的请求为CTRL+F5的操作.可见,在Opera下,表现更加不一样.即使只按F5,主页面的请求 (序号1)也有Pragma: no-cache请求头,CTRL+F5下,除了框架页面本身(序号8),所有的资源文件都跳过了缓存.这一点比较接近IE

五.Safari

序号1-5的请求为F5的操作,Safari不支持CTRL+F5.和Opera类似.F5会让主页面的请求(序号1)中包含Pragma: no-cache请求头.既然不支持跳过缓存,那么不管是不是框架页面,在Safari中只能点菜单清除缓存了.

解决办法

根据以上对比可以看出,只有IE浏览器的表现是我们想要的.这里给出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脚本是专业的火狐玩家使用的,这里顺便讲一下我是如何实现这个功能的.有兴趣玩火狐脚本的可以看一下.实在看不懂可以跳过.

复制代码
代码如下:

//在浏览器主窗口绑定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)
}
//捕获模式,第一时间触发事件处理函数.
},
true)

安装该扩展后,按下CTRL+F5能像IE一样,让所有的框架页面全都跳过缓存刷新.至于多层框架(框架中的框架),这个扩展不适用,我觉的各位程序员不会那么倒霉.

UrlReriter

什么是伪静态? 1.是通过正则映射把本是动态的页面转成

看起来

是静态的页面

为什么用伪静态? 1.浏览器不收录带'?' url 2.打开一个页面后(url 完全相同),再次打开会很快。因为转换页面是在内存中完成的,如果再次打开同一个页面,就不会再转换,而是直接在内存中读取。现在每转一个页面都换 url, 内存使用情况,自己考虑一下。。 3.cup 资源占用少(参考上一条) 4.看起来比较统一,能隐藏开发使用的语言什么情况下使用伪静态? 1.小型网站和特别在意浏览器收录的网站才使用(内容不经常换,又希望别人通过 搜索引擎能找到) 2.门户网站选择性的用,社区能不用就不用

更多精彩内容其他人还在看

网页设计技巧:iframe自适应高度的问题

所谓iframe自适应高度,就是,基于界面美观和交互的考虑,隐藏了iframe的border和scrollbar,让人看不出它是个iframe
收藏 0 赞 0 分享

网页色彩对比与调和技巧分享

在对比状态下,色彩相互作用与单一色彩所带给人的感觉不一样,这种现象是由视觉残影引起的。当我们长时间注视某一彩色图像之后,再看白色背景时,眼前会出现色相、明度关系大体相仿的补色图像
收藏 0 赞 0 分享

网页色彩性质的分类

任何颜色都可以使用三原色——红、绿、蓝组合而成,三原色中只有红色是暖色,所以要判断作品颜色的冷暖,可以依据红色成分的多少而定。色调主要由明度与彩度组合而成,用来表示颜色的状态
收藏 0 赞 0 分享

使用Photoshop 制作网页线框图简单实用

这篇文章向大家介绍一套免费的Photoshop 线框图套件,这个线框图套件中包括通知、图片和视频,表单字段,标题,段落,项目符号列表,导航,广告横幅和普通网站的元素,如:搜索框,电子邮件注册表单等等
收藏 0 赞 0 分享

CSS使用技巧总结

偶尔看到一篇CSS常用技巧的总结文章,本人整理了一下,晒出来和大家分享,希望可以帮助你们
收藏 0 赞 0 分享

Web设计师如何制作Retina显屏设备的图片

到目前为止,我们知道苹果设备中支持Retina屏幕技术的有“iPhone”、“iPod”、“iPad”和“Macbook Pro”,这些设备能为用户呈现更细腻、平滑和高质量的图片效果,提高了用户的视觉体验。做为一名Web设计师如何为你的网站创建这些适合Retina显屏设备的图片呢
收藏 0 赞 0 分享

JPG,GIF及PNG各类型的图片格式详细解说

大家都知道网页上面的图像一般用jpg、gif和png这几种格式,他们有什么区别以及在什么场合下使用进行详细介绍看了下面的内容后你可能会有了自己的结论
收藏 0 赞 0 分享

组件化的前端开发流程详细说明

做前端的同学都知道,做的页面多了,东西就会乱,因此我们需要统一一个开发流程,开发流程的好坏,直接影响着页面开发的效率,间接影响游戏的时间为了更好的开发,我们做了一下总结
收藏 0 赞 0 分享

我们在囧途之UI工程师职业感慨

我是一名还不算特别优秀的UI工程师;这个要先说明一下UI不是美工,美工是以图片方案设计为主的岗位,而UI是指用户交互体验的设计
收藏 0 赞 0 分享

分享8款提高网页设计出色的CSS工具

当一个人需要编辑或修改网站设计,CSS发挥着重要的作用;今天就给大家分享8款非常出色的CSS工具,这些工具都是很出名的,能够解决开发当中常见的棘手问题,希望对你开发有所帮助
收藏 0 赞 0 分享
查看更多