[转]浏览器(客户端)缓存

一般在硬件中,缓存在硬件中分一级缓存,二级缓存。但在软件中的缓存却不一样。

狭义上讲缓存就叫高速缓存,严格讲就是将数据暂时存放到某个地方。先要声明下,我的定义可能不严格,但这是我的理解,通俗易懂。

至于存到什么地方就有很多方式,可放到文件,内存中(如session),还有cache(高速缓存),还有cookie,session,viewstate,这些是我们经常用到的,但可以认为他们是缓存数据。其实cache跟session有相似功能,但cache可在代码中设置过期时间,依赖项。所谓依赖项(例如:微软的类cachedependcy sqlCacheDependency)当依赖项变动了,系统会通知cache过期,无效。以上只是说缓存,缓存可是有服务器缓存,客户端缓存啊。

近些天研究了下客户端缓存(即浏览器缓存),我想跟大家分享,有什么不同意见可评论。

估计大多数人很少说客户端缓存,包括我在内。那是因为我们编程时基本不考虑客户端缓存,书上也写得少。其实浏览器自动会管理缓存,但了解它至少知道有这么回事,有事编程还要控制客户端缓存。

浏览器缓存就是当你打开一个网页,浏览器会自动下载副本到你电脑上,就相当于你另存为网页到某个地方而已,只不过这里是自动而已。当然不是浏览器能把各种网页都能下载到本地电脑上,它是有特殊情况。一般html,后者request是get请求,而post一般不缓存。(这个后面会说到)

在你的浏览器上点击 工具-》internet选项(0)-》到浏览历史记录下点击设置-》检查所存网页的较新版本下有四个选项分别代表浏览器如何调用客户端所存的文件。

1.每次访问此页时检查:表示浏览器将发送一个信息给所要访问的页面的Web服务器,查询当前访问的信息是否有变动,如无变动,就从硬盘缓存中直接调用,而且每次访问都要发送信息给Web服务器进行验证。
2、每次启动Internet Explorer时检查:表示本次上网浏览器将只发送一次信息给Web服务器进行验证,以后无论信息是否发生变动,都从硬盘缓存中直接调用所要访问的页面的信息。
3、自动:表示浏览器将自动检查所要访问的信息最近是否发生变动,如有变动,则从Internet上重新下载网页;相反,则直接从硬盘中读取数据。
4、不检查:表示对要调用的页面信息不进行校验,直接从硬盘中调用。

自动选项与每次启动Internet Explorer时检查选项的功能相似,只是对图像的访问有所不同,如果随着时间的推移,浏览器发现网页上的图像更新并不频繁,这样,即使浏览器在对某个已缓存的图像执行本次启动运行以来的第一次访问时,它也不一定会向服务器发出访问请求,而是干脆直接使用缓存中的内容。

一般不设置第四项,可以看出选2,3项可能平时看到的是过期页面,解决上述故障的方法是随时按下浏览器的“刷新”或“Reload”按钮。选第选项可能每次都是得最新页面,但可能速度要慢点。

看下面有让你输:要使用的磁盘空间:这个不可大也不可小,系统会有个默认的,因为小的话,缓存的东西太少,大的话到时浏览器调用缓存的东西要找的时间久会很长。所以这个数字还是系统默认吧。看下面有个当前位置:后面跟着一个路径C:"Documents and Settings"LocalService"Local Settings"Temporary Internet Files,这个路径就是浏览器默认缓存的位置。当然下面有移动文件夹可把缓存位置换到其他路径下。可能一般的人找不到这个路径,因为这路径被隐藏。需要操作工具-》文件夹选项-》查看选显示所有文件和文件夹和去掉隐藏受保护的操作系统文件的勾。这是你将能看到那个路径了。

当然客户端缓存是否需要是可以在服务端代码上控制的。那就是响应头。

响应头告诉缓存器不要保留缓存,缓存器就不会缓存相应内容;

如果请求信息是需要认证或者安全加密的,相应内容也不会被缓存;

如果在回应中不存在校验器(ETag或者Last-Modified头信息),缓存服务器会认为缺乏直接的更新度信息,内容将会被认为不可缓存。所有新一代的Web服务器都对静态内容(如:文件)自动生成ETagLast-Modified头信息,而你不必做任何设置。但是,服务器对于动态内容(例如:CGI,ASP或数据库生成的网站)并不知道如何生成这些信息如果输出会根据cookie,认证信息或者其他外部条件变化,则还是不可缓存的


校验参数非常重要,如果回应中1个参数都不存在,并且没有任何信息说明保鲜期(ExpiresCache-Control)的情况下,缓存将不会存储任何副本;
最常见的校验参数是文档的最后修改时间,通过最后Last-Modified头信息可以,当一份缓存包含Last-Modified信息,他基于此信息,通过添加一个If-Modified-Since请求参数,向服务器查询:这个副本从上次查看后是否被修改了。
HTTP 1.1
介绍了另外一个校验参数: ETag,服务器是服务器生成的唯一标识符ETag,每次副本的标签都会变化。由于服务器控制了ETag如何生成,缓存服务器可以通过If-None-Match请求的返回没变则当前副本和原件完全一致。
所有的缓存服务器都使用Last-Modified时间来确定副本是否够新,而ETag校验正变得越来越流行。

响应头如果是POST模式递交数据,则返回的页面大部分不会被浏览器缓存,如果你发送内容通过URL和查询(通过GET模式),则返回的内容可以缓存下来供以后使用。

HTTP协议中关于缓存的信息头关键字包括Cache-Control(HTTP1.1),Pragma(HTTP1.0),last-Modified,Expires等。

在网上  摘抄的一段关于http 头部

      HTTP1.0中通过Pragma 控制页面缓存,可以设置:Pragma或no-cache。网上有非常多的文章说明如何控制不让浏览器或中间缓存服务器缓存页面,通常设置的值为no-cache,不过这个值不这么保险,通常还加上Expires置为0来达到目的。但是如我们刻意需要浏览器或缓存服务器缓存住我们的页面这个值则要设置为Pragma。

      HTTP1.1中启用Cache-Control 来控制页面的缓存与否,这里介绍几个常用的参数:

  • no-cache,浏览器和缓存服务器都不应该缓存页面信息;
  • public,浏览器和缓存服务器都可以缓存页面信息;
  • no-store,请求和响应的信息都不应该被存储在对方的磁盘系统中;
  • must-revalidate,对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时;
  • max-age=xxx,s-max-age=xxx,替代Expires,表示应该在xxx秒后认为页面过时,后者指示代理服务器中缓存(通常称为共享缓存)的页面过期时间。(不过我试了好多次,这个选项一直没法实现,希望有人能补充!)

       通常我们不需要缓存页面时设置该值为"no-cache,no-store,must-revalidate"(分三行代码设置);需要缓存页面信息时则设置该值为"public,max-age,s-max-age"。

posted on 2009-06-27 09:57  小龙龙  阅读(291)  评论(0编辑  收藏  举报

导航