background image

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