浏览器缓存

浏览器一般会在用户的文件系统创建一个文件夹存放临时文件 .

浏览器缓存只是针对它所属的用户有效 .

HTTP缓存协商 : 请求 -> 服务器返回并告知缓存 -> 再次请求并询问是否使用缓存 -> 服务器接收询问,决定 使用缓存 或 重新返回数据

Last-Modified(最后修改时间) :

动态文件一般不存在传统意义上的最后修改时间 , 而静态文件则是有服务器自动给添加的最后修改时间 , 使用的是 GMT 时间格式.

服务器返回并告知缓存  的时候 , 会在返回头信息里面添加一个  Last-Modified 属性 , 并指定一个时间值 , 再次请求的时候 , 浏览器会在请求头信息里面添加一个  If-Modified-Since 的属性 , 并把缓存的最后时间给带上 , 服务器会自动判断文件是否在  If-Modified-Since  值之后有更新 , 如果有更新则返回新数据 , 没有更新则返回 304 Not Modified

给PHP程序添加 Last-Modified : header("Last-Modified: ".gmdate("D , d M Y H:i:s") . " GMT") ;

动态程序的 Last-Modified  再次请求时 , 服务器不会自动判断 , 需要手动写 PHP 程序获取值判断觉得返回 :  $_SERVER['HTTP_IF_MODIFIED_SINCE']

 

Last-Modified(最后修改时间)的缺点 :

1 时间数据内容没有做修改 , 但是文件的最后修改时间改变了 , 也会重新返回数据 , 比如  文件内容里加了一个空格

2 分布式部署 , 负载均衡时 , 多台服务器部署的同一文件最后修改时间不同 , 也会频繁的重新返回数据

 

 

另一种协商方法 : ETag

ETag  :  没有采用内容的最后修改时间 , 而是采用了一串编码来标记内容 。 如果 ETag 没有变化 , 那么这个内容即没有更新 。 Web 服务器会给静态页面生成一个 ETag 。

 

浏览器缓存截止期 :  Expires

Expires : 告诉浏览器该内容在何时过期 , 并暗示浏览器在该内容过期之前不需要再询问服务器 , 而直接使用本机缓存即可 。

默认情况下 , Web 服务器不会给静态文件添加 Expires 标记

Expires 缺点 : 服务器返回 Expires 标记的值时服务器时间 , 如果本机时间跟 服务器时间不一致 , 则会导致该标记无效 。

Expires 弥补 : HTTP/1.1 中还有一个标记用于弥补 Expires 的不足  , 那就是  Cache-Control

Cache-Control : max-age=<second>    , 这里指定了缓存过期的相对时间 , 单位是秒 , 并且这个时间是相对于浏览器本地的时间 。

Expires 和 Cache-Control 时 , 浏览器会优先考虑 Cache-Control

posted on 2012-04-05 16:25  多个马甲  阅读(278)  评论(0编辑  收藏  举报