日期:2014-05-17  浏览次数:20466 次

关于缓存问题
1、
<h1>aa</h1>
<img src="1.jpg" width="100" />
<img src="2.jpg" width="100" />


为了验证浏览器缓存,我进行如下操作:
第一次正常打开这个页面。然后第二次,在地址栏按回车(不是刷新)访问

以下访问方式均是在第二次(回车访问)访问时抓取的包:
(1)在IE用httpwatch看,确实是从缓存中读的文件,而且没有向服务器端发送HTTP请求
 
(2)在FireFox下用FireBug看,应该也是从缓存中读取的文件,因为这个页面只发起了一次HTTP请求(第一次是3个)。
问题是:它为什么还会发起这个请求呢?不是应该直接从本地读取文件吗?
 

2、
为了使这个文件禁用缓存,我做了如下设置:
Expires: -1
Cache-Control: no-cache
pragma: no-cache

用 IE看,确实没有从缓存中读取文件,而是发起了一个HTTP请求,而且返回了200。但是我的问题是,如果没有从缓存中读这个文件,那浏览器应该向服务器发送3次请求才对啊?即便图片被缓存,也应该发起请求返回304码以后,再从本地读啊。为什么它只发起了一次呢???
 


3、
浏览器一般默认缓存页面的时间是多久呢?如何在HTTP响应头信息中设置呢?




非常感谢!!! : )


------解决方案--------------------
1、正常的流程是发起一次请求,以判断目标文件是否发生了改变。如没有改变则从缓存读取
IE 在感知地址栏内容没有改变时,就不发起请求,这也是可能的
2、你禁用缓存的头只作用于页面文件自身,并没有作用于图片(你没说对图片也禁用了缓存)
------解决方案--------------------
浏览器和浏览器是不同的,有的浏览器是根本不理会你那些浏览器缓存报文头的,一律使用etag/if-modified-since请求服务器,有的浏览器可能是不管你是否expires 是1970年什么的或者cache-control:no-cache的不缓存response, 都缓存一段时间。 一般浏览器都是后者,也就是说浏览器缓存是实现相关的,协议是协议,浏览器的实现是浏览器实现者的问题。