Expires: Thu, 02 Apr 2009 05:14:08 GMT
Etag: “5d8c72a5edda8d6a:3239″
一、
Last-Modified、Expires 和 Etag 相关工作原理
1、Last-Modified
在浏览器第一次请求某一个
URL 时,服务器端的返回状态会是 200,内容是你请求的资源,
同时有一个
Last-Modified 的属性标记(Http Reponse Header)此文件在服务期端最后被修改的
时间,格式类似这样:
1 Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
客 户端 第二 次请 求此
URL
时 ,根 据
HTTP
协议 的规 定, 浏览 器会 向服 务器 传送
If-
Modified-Since 报头(Http Request Header),询问该时间之后文件是否有被修改过:
1 If-Modified-Since: Tue, 24 Feb 2009 08:01:04 GMT
如
果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为
空,这样就节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资
源,返回和第一次请求时类似。从而 保证不向客户端重复发出资源,也保证当服务器有变
化时,客户端能够得到最新的资源。
注:如果
If-Modified-Since 的时间比服务器当前时间(当前的请求时间 request_time)还晚,
会认为是个非法请求
2、Etag 工作原理
HTTP 协议规格说明定义 ETag 为“被请求变量的实体标记” (参见 14.19)。
简单点即服务器响应时给请求
URL 标记,并在 HTTP 响应头中将其传送到客户端,类似服
务器端返回的格式:
1 Etag: “5d8c72a5edda8d6a:3239″
客户端的查询更新格式是这样的:
1 If-None-Match: “5d8c72a5edda8d6a:3239″
如果
ETag 没改变,则返回状态 304。
即
:在客户端发出请求后,Http Reponse Header
中包含
Etag: “5d8c72a5edda8d6a:3239″
标识,等于告诉
Client 端,你拿到的这个的资源有表示 ID:5d8c72a5edda8d6a:3239。
当下次需要发
Request 索要同一个 URI 的时候,浏览器同时发出一个 If-None-Match 报头(
Http Request Header)此时包头中信息包含上次访问得到的 Etag: “5d8c72a5edda8d6a:3239″标
识。
1 If-None-Match: “5d8c72a5edda8d6a:3239″
这样,
Client 端等于 Cache 了两份,服务器端就会比对 2 者的 etag。如果 If-None-Match 为
False,不返回 200,返回 304 (Not Modified) Response。
3、Expires
给出的日期
/时间后,被响应认为是过时。如 Expires: Thu, 02 Apr 2009 05:14:08 GMT
需和
Last-Modified 结合使用。用于控制请求文件的有效时间,当请求数据在有效期内时客
户端浏览器从缓存请求数据而不是服务器端
. 当缓存中数据失效或过期,才决定从服务器更
新数据。
4、Last-Modified 和 Expires
Last-Modified 标识能够节省一点带宽,但是还是逃不掉发一个 HTTP 请求出去,而且要和
Expires 一起用。而 Expires
标识却使得浏 览器干脆连
HTTP 请求都不用发,比如当用户 F5
或者点击
Refresh 按钮的时候就算对于有 Expires 的 URI,一样也会发一个 HTTP 请求出去,
所以,Last-Modified
还是要用的,而 且要和
Expires 一起用。
5、Etag 和 Expires