第一次先请求某个网页,抓取到本地,假设文件名为 a.html。这时文件系统有个文件的修改时间。
 第二次访问网页,如果发现本地已经有了 a.html,则向服务器发送一个 If-Modified-Since 的请求(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html)。 把 a.html 的修改时间写到请求里。
 如果网页更新了,服务器会返回一个  的应答,这时就重新抓取网页,更新本地文件。
 如果网页没有更新,服务器会返回一个304的应答。这时就不需要更新文件了。
304 Not Modified
  客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。
自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
如果网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为 If-Modified-Since HTTP 标头)。服务器可以告诉 Googlebot 自从上次抓取后网页没有变更,进而节省带宽和开销。

今天在用chrome浏览淘宝页面的时候,发现很多来自淘宝图片HTTP状态码是 304 Not Modified

到百度搜索了一下,明白了 304状态的含义(以下绿色内容来自网络):

304 Not Modified:客户端有缓冲的文件并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

如果客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 。对于静态文件,例如:CSS、图片,服务器会自动完成 Last Modified 和 If Modified Since 的比较,完成缓存或者更新。但是对于动态页面,就是动态产生的页面,往往没有包含 Last Modified 信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个 200 的请求。

我突然想起我所写的图片服务器没有实现HTTP 304 缓存功能。

这个 304 状态一般主要在用户刷新页面(F5键)的时候触发,当用户在刷新页面的时候,因为原来的页面里的很多图片已经缓存过,客户端的浏览器已经记录了图片的最后更新时间(Last Mod),所以在用户刷新页面的时候,会向服务器提交一个字段:If-Modified-Since: Wed, 08 Sep 2010 21:35:06 GMT

这个时候,服务器端的程序先取得这个字段的值,然后与服务器上的图片最后修改时间对比,如果相同,就直接返回 304 Not Modified ,然后停止。这样就不用把图片重新传输到客户端,达到节省带宽的目的。

关于 Cache-Control: max-age=秒 和 Expires

Expires = 时间,HTTP 1.0 版本,缓存的载止时间,允许客户端在这个时间之前不去检查(发请求)
max-age = 秒,HTTP 1.1版本,资源在本地缓存多少秒。
如果max-age和同时存在,则被Cache-Control的max-age覆盖。

Expires
的一个缺点就是,返回的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相差很大,那么误差就很大,所以在HTTP
1.1版开始,使用Cache-Control: max-age=秒替代。

今天我还发现一个小的问题,是关于客户端的日期格式:

Wed, 08 Sep 2010
21:35:06 GMT
Wed, 8 Sep 2010 21:35:06
GMT

注意上面的格式,一个是8的前面有个前置的0,一个没有。

我发现firefox和chrome对这个日期格式处理一致,ie有点不同。
最终我修改了服务器端的程序:
//HTTP 日期格式: Wed,
08 Sep 2010 21:35:06 GMT
DateFormat dateFormatGMT = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH);
//时间格式

最新文章

  1. 查看Validate Subscription 的结果
  2. Head First Html and CSS学习笔记之HTML
  3. ini_set 设置php配置项 在windows和linux下的不同
  4. Windows程序==>>使用ListView控件展示数据
  5. JavaScript基础16——js的BOM对象
  6. 随机步法A-Z
  7. Mysql date_sub函数使用
  8. CorelDraw x6【Cdr x6】官方简体中文破解版(64位)安装图文教程、破解注册方法
  9. 《Python基础教程(第二版)》学习笔记 -> 第一章 基础知识
  10. Jquery实现日期格式化
  11. java中只能有一个实例的类的创建
  12. JSP标准标签库(JSTL)--核心标签库 c
  13. ural1752 Tree 2
  14. HTML文档及标签介绍
  15. python编程基础—正则表达式
  16. WebService之CXF注解之一(封装类)
  17. A*寻路算法入门(一)
  18. java 23种设计模式教程
  19. android:项目迁移error:Please change caller according to com.intellij.....
  20. Kotlin入门简介

热门文章

  1. POJ 3986 Math teacher's homework
  2. Linux下基于Erlang的高并发TCP连接压力实验
  3. 双击GridView查看详情
  4. 基于visual Studio2013解决面试题之1405归并排序
  5. HDU1686——Oulipo
  6. HDU 5046 Airport(DLX反复覆盖)
  7. Swift - 使用CABasicAnimation实现动画效果
  8. winform窗体全屏
  9. GreenDao数据库结构升级
  10. IOS详解TableView——对话聊天布局的实现