客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。服务端只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 。

对于静态文件,例如:CSS、图片,服务器会自动完成 Last Modified 和 If Modified Since 的比较,完成缓存或者更新。但是对于动态页面,就是动态产生的页面,往往没有包含 Last Modified 信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个 200 的请求。

因此,对于动态页面做缓存加速,首先要在 Response 的 HTTP Header 中增加 Last Modified 定义,其次根据 Request 中的 If Modified Since 和被请求内容的更新时间来返回 200 或者 304 。虽然在返回 304 的时候已经做了一次数据库查询,但是可以避免接下来更多的数据库查询,并且没有返回页面内容而只是一个 HTTP Header,从而大大的降低带宽的消耗,对于用户的感觉也是提高。当这些缓存有效的时候,通过 Fiddler 或HttpWatch 查看一个请求会得到这样的结果。

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

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

对于静态资源来说,浏览器不会缓存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

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

1

如果这个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的机制还是有很大区别的。

java304_HTTP 304状态码相关推荐

  1. 请解释一下http请求中的304状态码的含义

    请解释一下http请求中的304状态码的含义 304 未被修改. 自从上次请求后,请求的网页未被修改过.服务器返回此响应时,不会返回网页内容. 如果网页自请求者上次请求后再也没有更改过,你应将服务器配 ...

  2. http缓存机制之304状态码

    在网上看到一篇关于解释浏览器缓存更新机制304状态码的文章,里面说如果请求头中的If-Modified-Since字段和If-None-Match字段的值分别和响应头中的Last-Modified字段 ...

  3. HTTP 204,304状态码

    https://blog.csdn.net/huwei2003/article/details/70139062 HTTP的状态码有很多种,主要有1xx(临时响应).2xx(成功).3xx(已重定向) ...

  4. 304状态码详解(协商缓存)

    304状态码详解(协商缓存) 上一篇文章针对不同的状态码做了一个整理,还说到要专门针对304做一个详解,于是与,今晚又来学习了. 首先说一下背景: 我们知道前端代码打包后需要部署到静态服务器上.客户端 ...

  5. HTTP 304状态码讲解

    HTTP 304状态码的详细讲解 304状态码或许不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应. 整个请求响应过程如下: 客户端在请求一个文件的时候,发现自己缓存的文件有 Last ...

  6. HTTP 304状态码的详细讲解

    HTTP 304状态码的详细讲解 304状态码或许不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应. 整个请求响应过程如下: 客户端在请求一个文件的时候,发现自己缓存的文件有 Last ...

  7. 服务器状态304,解析304状态码错误提示的原因与解决304错误提示的方法

    对于第304页的错误,一直是SEO工作人员老生常谈的话题.初始网站管理员对304错误非常敏感.互联网上总是有与之相关的新闻,比如:大量的304状态码会在网站上被降级,但这是真的吗? 一.304错误提示 ...

  8. html 状态 304,网站频繁出现304状态码的原因

    原标题:网站频繁出现304状态码的原因 很多SEOER经常说网站日志反回值304是怎么回事? 经常会碰到站长们抱怨蜘蛛抓取返回码老是304状态,且抓取的次数越来越少的问题.搜索引擎为了自身的用户体验, ...

  9. HTTP Status Code 304 状态码的详细讲解

    HTTP 304状态码的详细讲解 304状态码或许不应该认为是一种错误,而是对客户端有缓存情况下服务端的一种响应. 整个请求响应过程如下: 客户端在请求一个文件的时候,发现自己缓存的文件有 Last ...

最新文章

  1. Linux服务器负载均衡LB
  2. CygWin / 安装软件包的方法
  3. CF388C-Fox and Card Game【博弈论,结论】
  4. Python 基础知识整理-2
  5. Ubuntu下如何使用虚拟机安装WindowsXP?(2)【转】
  6. 如何恢复回收站清空的文件?简单步骤教你操作
  7. ubuntu20.04 搭建tftp服务器
  8. PHP/PHPStudy所需的VC9-VC14的运行库
  9. 新手入门:Javascript的使用技巧大全(二)
  10. linux测试dns配置文件,Linux系统中如何查看和修改DNS配置
  11. Matlab小波变换-音频去噪
  12. 矩阵转置行列式的运算规律
  13. 房子千万不要这样装修啊 别说我没告诉你
  14. QCC512x QCC302x 延时函数 (阻塞与非阻塞)
  15. 新网(万网)账户间域名的转移
  16. python实现闰年判断
  17. 技术文摘9 刘 樱桃
  18. linux电脑每天定时重启命令,linux的定时重启的具体命令
  19. 【AI实时变声器,声音甜甜的小姐姐背后竟是抠脚大汉】
  20. Udacity数据分析(进阶)——清洗与分析数据(Twitter数据集)

热门文章

  1. 戴尔服务器ghost系统安装教程,戴尔台式机重装系统教程
  2. ADSL接入网的结构
  3. android拍照身份证边框,Android自定义证件拍照控件之CameraCardCrop
  4. 印能捷怎样安装在虚拟服务器,超详细Prinergy(印能捷)安装及设置教程
  5. cloudreve win10 解析域名_Cloudreve 云盘直链获取源码
  6. 细胞是怎样衰老、自杀和癌变的?
  7. svn下载后出现红叉 怎么解决 在线等。。。
  8. 雅可比迭代法——高赛迭代法
  9. 【Java学习整理】2021最新版 Eclipse下载+安装+页面介绍+常见问题解答+查看源码+常用快捷键+Debug调试(详细)
  10. OptaPlanner-车间调度个人心得-matlab