周梦康 发表于 2014-06-22 3731 次浏览 标签 : http协议

对 HTTP 304 Not Modified 的理解

在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:

Last-Modified: Fri, 12 May 2006 18:53:33 GMT

客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:

If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT

如果服务器端的资源没有变化,则自动返回 HTTP 304 Not Modified 状态码,内容为空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能够得到最新的资源。

2014.7.9

今天看到雅虎军规,看到里面提到了ETags

实体标签(ETags)是服务器和浏览器之前用来判断是否命中浏览器cache里的缓存内容的一种决策机制。(实体就是组件:图片,脚本,样式等。)ETags用来验证实体是否有效要比Last-Modified-Date头信息更加灵活。它是某一个版本组件的唯一标示,是字符串形式,需要用引号引起来。原始服务器在ETag头输出组件的ETag信息,例如:

HTTP/1.1 200 OK 
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT 
ETag: "10c24bc-4ab-457e1c1f" 
Content-Length: 12195

后来,如果浏览器需要验证该组件,它就使用If-None-Match头把收到的ETag信息发送回原始服务器。如果ETag匹配上了,服务器就直接返回304状态码以节省开销,例如:

GET /i/yahoo.gif HTTP/1.1
Host: us.yimg.com
If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT
If-None-Match: "10c24bc-4ab-457e1c1f"
HTTP/1.1 304 Not Modified

ETag通常是有组件在服务器上的属性组成的,这样让它们是唯一的,也是有一些问题的。如果浏览器在一台原始服务器上取得某一个组件和ETag信息,当它试图去另外一台服务器上验证该信息时往往时不能成功的。更多的信息请自行搜索下吧。

评论列表