首页 > Apache, Nginx, PHP, 项目开发 > 有关Last-Modified 与 If-Modified-Since

有关Last-Modified 与 If-Modified-Since

2010年12月24日 发表评论 阅读评论

在http中Last-Modified 与If-Modified-Since 都是用于记录页面最后修改时间的 HTTP 头信息,注意,在这 Last-Modified 是由服务器往客户端发送的 HTTP 头,另一个 If-Modified-Since是由客户端往服务器发送的头,可以看到,再次请求本地存在的 cache 页面时,客户端会通过 If-Modified-Since 头将先前服务器端发过来的 Last-Modified 最后修改时间戳发送回去,这是为了让服务器端进行验证,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,则返回新的内容,如果是最新的,则 返回 304 告诉客户端其本地 cache 的页面是最新的,于是客户端就可以直接从本地加载页面了,这样在网络上传输的数据就会大大减少,同时也减轻了服务器的负担。而且在一些ajax应用中,要求获取的数据永远是最新的,而不是读取位于缓存中的数据,做这样的设置是非常有必要的。

nginx与apache对此有不同的算法:

APACHE:

(1)直接发送请求,返回200,Last-Modified: Mon, 26 Apr 2010 13:22:17 GMT

[root@test ~]# curl -I http://www.pengyao.org/test.html
HTTP/1.1 200 OKDate: Mon, 26 Apr 2010 14:59:09 GMTServer: Apache/1.3.41 (Unix)Last-Modified: Mon, 26 Apr 2010 13:22:17 GMTETag: “92c027-897-4bd59389″Accept-Ranges: bytesContent-Length: 2199Content-Type: text/plain

(2)指定与Last-Modified时间相同的If-Modified-Since 发送GET请求,返回304

[root@test ~]# curl -I -G -H “If-Modified-Since: Mon, 26 Apr 2010 13:22:17 GMT” http://www.pengyao.org/test.html
HTTP/1.1 304 Not ModifiedDate: Mon, 26 Apr 2010 15:02:06 GMTServer: Apache/1.3.41 (Unix)ETag: “92c027-897-4bd59389″

(3)调后If-Modified-Since 1小时,再次发送GET请求,返回依然为304[root@test ~]# curl -I -G -H “If-Modified-Since: Mon, 26 Apr 2010 14:22:17 GMT” http://www.pengyao.org/test.html
HTTP/1.1 304 Not ModifiedDate: Mon, 26 Apr 2010 15:05:02 GMTServer: Apache/1.3.41 (Unix)ETag: “92c027-897-4bd59389″
说明Apache 在判断浏览器cache是否过期时,依据从If-Modified-Since开始,文件Last-Modified是否修改过来判断的,与RFC1945中对If-Modified-Since描述吻合.

NGINX:

(1)直接发送请求,返回200,Last-Modified: Wed, 21 Apr 2010 13:14:21 GMT

[root@test pengyao.org]# curl -I http://www.pengyao.org/index.html

HTTP/1.1 200 OK

Server: nginx/0.7.61

Date: Mon, 26 Apr 2010 15:18:29 GMT

Content-Type: text/html; charset=UTF-8

Content-Length: 323

Last-Modified: Wed, 21 Apr 2010 13:14:21 GMT

Connection: keep-alive

Accept-Ranges: bytes

(2)指定与Last-Modified时间相同的If-Modified-Since 发送GET请求,返回304

[root@test pengyao.org]# curl -I -G -H “If-Modified-Since: Wed, 21 Apr 2010 13:14:21 GMT” http://www.pengyao.org/index.html

HTTP/1.1 304 Not Modified

Server: nginx/0.7.61

Date: Mon, 26 Apr 2010 15:20:45 GMT

Last-Modified: Wed, 21 Apr 2010 13:14:21 GMT

Connection: keep-alive

(3)调后If-Modified-Since 1小时,再次发送GET请求,发现返回的结果为200,与Apache不同

[root@test pengyao.org]# curl -I -G -H “If-Modified-Since: Wed, 21 Apr 2010 14:14:21 GMT” http://www.pengyao.org/index.html

HTTP/1.1 200 OK

Server: nginx/0.7.61

Date: Mon, 26 Apr 2010 15:21:19 GMT

Content-Type: text/html; charset=UTF-8

Content-Length: 323

Last-Modified: Wed, 21 Apr 2010 13:14:21 GMT

Connection: keep-alive

Accept-Ranges: bytes

由此可以判断出,nginx在判断浏览器cache是否过期时,判断If-Modified-Since与Last-Modified是否匹配,如果不匹配,则认为cache过期,返回200重新下载.

分类: Apache, Nginx, PHP, 项目开发 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.