`

谈谈浏览器的缓存过期时间

阅读更多

一.浏览器为什么要缓存?什么会缓存下来? 

        首先当我们访问网页的时候,很多大的图片从服务器上传输过来的时候,试想一下,如果浏览器不把图片缓存下来而是每次都要到服务器去取,那么每次都给服务器和网络造成了巨大的负担。

        对于静态资源来说,浏览器不会缓存html页面的,所以你每次改完html的页面的时候,html都是改完立即生效的,不存在什么有缓存导致页面不对的问题。浏览器缓存的东西有图片,css和js。这些资源将在缓存失效前调用的时候调用浏览器的缓存内容。

 

二.怎么让浏览器的缓存的东西不失效?

        文档里有种说法是吧header中的Expires:设置为Sun, 17-Jan-2038 19:14:07 GMT,因为这个时间是32位unix支持的最大的时间值。

        但是网上有种说法就是IIS6 最大的时间只能到31-Dec-2035

If you’re using IIS6 you’ll find that the UI won’t allow anything beyond 31-Dec-2035.

        总之我们把这个时间设置到很大就可以了。下面是访问google时一个response返回的值。

        补充一下,如果expires的时间为-1,那么缓存会立即失效。如果是一个将来时间,那么它将在将来时间失效。

 

三.怎么让浏览器不缓存静态资源?

        一种方式就是让你的页面有这样的header,Cache-Control: no-cache header,这样浏览器就不会缓存静态资源了,每次取数据的时候都去服务器上重新获取。

        补充一下,如果设置no-cache的时候对IE是有效的,但是对于firefox是不行的,如果让firefox也不缓存要在header中加一个Cache-Control: no-cache, no-store

        另外一种方式就是让你的静态资后缀加上一个版本号,比如

<link rel="stylesheet" type="text/css" href="../css/icon.css?version=3.1.32(2013-05-31)"/>

        如果这个version有改变的话,下次就会重新获取这个静态资源。这样做的好处就是由你来控制什么时候来获取新的版本的静态资源。 

 

四.如果不设置这些浏览器用什么来控制缓存失效?

        header中有一个参数叫Last-Modified ,这个是由服务器自动加上的,如果有这个参数,那么浏览器每次都会重新计算本地的cache。如果浏览器返回一个304的编码就表示资源没有改变,那么浏览器就可以使用本地的cache。

        就如参考文档中说的,对于IE来说,如果没有设置expirse header的时候,IE的缓存时间就是一个session的时间,如果用户打开一个新的IE窗口的时候,他们就会获取最新的静态资源。但是对于firefox来说它就不是这样了,它是依赖last—modified的时间的(HTTP 1.1 spec RFC2616)。

Also, if the response does have a Last-Modified time, the heuristic expiration value SHOULD be no more than some fraction of the interval since that time. A typical setting of this fraction might be 10%.

        也就是说firefox的失效时间=现在时间+0.1*(time-last-modified ),就是他将在它上一次修改时间的十分之一的时间差的时候失效。

        为什么这么做呢?我们可以想象一个文件越久没有修改,那么它就越稳定,所以缓存的时间也就越长。只是这个时间差要除以10。

        比如一个文件上次修改时间为100天之前,那么那10天后才会失效。  

       

        总结一下,以前对浏览器的缓存及失效了解的不是很透彻,具体是如何失效的也不太清楚,那么现在对于如何能改变缓存,永久缓存及合适能失效都有了比较详细的了解。另外要注意的就是IE和firefox的机制还是有很大区别的。

        进一步参考文档:

http://blog.httpwatch.com/2007/12/10/two-simple-rules-for-http-caching/

http://blog.httpwatch.com/2008/10/15/two-important-differences-between-firefox-and-ie-caching/

 

文章来源:http://my.oschina.net/zimingforever/blog/134914?fromerr=5ygd55ZT

  • 大小: 66.5 KB
分享到:
评论

相关推荐

    谈谈强制缓存和协商缓存

    先来说一下缓存的优点 减少了冗余的数据传递,节省宽带流量 减少了服务器的负担,大大提高了网站性能 加快了客户端加载网页的速度 这也...max-age=n :缓存内容在n秒后过期 no-cache:需要协商缓存验证数据 no-store

    网络编程Web实验

    这些功能的实现涉及了HTTP协议、URL解析、网页渲染和浏览器缓存等多个核心概念。 首先,我们来谈谈HTTP(超文本传输协议)。它是Web通信的基础,允许客户端(浏览器)向服务器发送请求获取资源,如HTML页面。HTTP...

    YII框架http缓存操作示例

    `etagSeed`属性则用于通过计算文件内容生成ETag(实体标签),ETag用于判断浏览器缓存的数据是否与服务器一致,如果一致则无需重新请求数据。这个示例中的ETag是通过读取`hw.txt`文件的第一行来生成的。 在HTTP缓存...

    memcached和js版本控制

    2. **过期时间**:为防止缓存数据长时间未更新导致信息滞后,可以设置过期时间。过期时间可以通过`expire`参数来设定。 3. **分布式哈希**:memcached不关心数据的存储位置,通过一致性哈希算法将键映射到不同的...

    WebKit和Chromium源码及原理剖析.pdf

    - 新的规范允许使用一种名为“stale-while-revalidate”的策略,即在响应数据过期后仍可以使用一段时间,直到后台完成数据的有效性验证。这一特性提高了用户体验,减少了延迟。 - 隐身模式下,浏览器通常不会使用...

    java面试宝典

    152、如何设置cookie在某一时间后过期? 37 153、如何获得当前的sessions数? 37 154、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗? 37 155、对一个JSP页,如果多个客户端同时请求它,同步可能吗...

Global site tag (gtag.js) - Google Analytics