web服务器通过http发送字段可以指定浏览器缓存
HTTP 1.0 中的 Expires 是1.0中指定的浏览器缓存时间
HTTP 1.1 中的Cache-Control 指定浏览器缓存时间
浏览器会将请求内容存储到本地,以url为key内容为content存储
若指定浏览器缓存时间,浏览器会通过检测 Expires / Cache-Control 与Date(收到内容缓存的时间),缓存过期会发送请求到web服务器
Cache-Control 的值可以有以下:
Public指示响应可被任何缓存区缓存。
Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
no-cache指示请求或响应消息不能缓存
no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
常用max-age:num_sec 指定缓存时间
Cache-Control 与 Last-Modified/If-Modified-Since 结合使用
设置 Last-Modified到浏览器,浏览器存储这个值,这个值是文件最后一次改动的时间,时间格式为GMT
当Cache-Control 指定的缓存时间过期后 浏览器发送 请求头 If-Modified-Since 是这个最后修改时间
web服务器可以自己判断文件是否过期选择发送 200还是304(强制浏览器使用本地缓存)
判断代码:
// 根据文件修改时间判断
$mtime = filemtime(__FILE__); // 文件修改时间
if(array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER)&&strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])>=$mtime) //对比文件修改时间
{
header('HTTP/1.1 304 Not Modified');
}
header("Cache-Control: max-age=10");
header("Last-Modified: ".gmdate('l, d F Y H:i:s',$mtime).' GMT');
Cache-Control与 Etag/If-None-Match 结合使用 (优先级高于Last-Modified/If-Modified-Since)
发送ETag到浏览器,浏览器存储值,这个值可以自己设置,默认Apache中,ETag的值,默认是对文件的索引节(INode),大小(Size)和最后修改时间(MTime)进行Hash后得到的
当Cache-Control 指定的缓存时间过期后 浏览器发送 请求头 If-None-Match 这个是浏览器得到的ETag
web服务器可以自己判断文件是否过期选择发送 200还是304(强制浏览器使用本地缓存)
判断代码:(这里使用的是sha1_file 判断文件是否修改)
// 根据tag判断是否缓存
$tag = sha1_file(__FILE__);
if(array_key_exists('HTTP_IF_NONE_MATCH', $_SERVER)&&$_SERVER['HTTP_IF_NONE_MATCH']==$tag) //对比文件修改时间
{
header('HTTP/1.1 304 Not Modified');
}
header("Cache-Control: max-age=10");
header("ETag: ".$tag);
总结:
Date 是浏览器获取数据(http 200)的时间,这也是浏览器生成本地缓存的时间
Expires 指定浏览器缓存时间 http1.0
Cache-Control 指定浏览器缓存时间 http1.1 优先级比 Expires高且可设置项更多
Last-Modified/If-Modified-Since与Etag/If-None-Match
后者的优先级高,都是在浏览器缓存时间过期后会发送头信息到web服务器,是否304由web服务器端自行处理
ETag更灵活,Last-Modified 只能设置GMT格式的时间
用户的操作对缓存的影响:
用户操作 | Expires/Cache-Control | Last-Modified/Etag |
地址栏回车 | 有效 | 有效 |
页面链接跳转 | 有效 | 有效 |
新开窗口 | 有效 | 有效 |
前进、后退 | 有效 | 有效 |
F5刷新 | 无效 | 有效 |
Ctrl+F5刷新 | 无效 | 无效 |
参考:
http://blog.csdn.net/czp11210/article/details/37693553
http://blog.csdn.net/dinglang_2009/article/details/38142641