我尝试使用以下代码在我的PHP页面中设置ETAG,
$time = strtotime(date('Y-m-d H:i:').'00');
$lastmod = gmdate('D, d M Y H:i:s \G\M\T', $time);
$etag = '123';
$ifmod = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] == $lastmod : null;
$iftag = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? $_SERVER['HTTP_IF_NONE_MATCH'] == $etag : null;
if (($ifmod || $iftag) && ($ifmod !== false && $iftag !== false)) {
header('HTTP/1.0 304 Not Modified');
die;
} else {
header("Last-Modified: $lastmod");
header("ETag: $etag");
echo "My Page content";
}
我写这段代码用于缓存启用一分钟,但它并不完美,因为
strtotime(date('Y-m-d H:i:').'00');
不会给出绝对的一分钟间隔。
还有其他解决方案吗?
答案 0 :(得分:2)
我很难理解你的问题。我认为其中很大一部分原因是Etags与过期时间无关。你可以在到期时间之前使用Etag作为代理,但这相当于失败了。
如果您首先使用正确的缓存信息提供了内容,那么客户端将不会发出条件请求,直到缓存时间已过期。
仅场景,使用Etags管理缓存是您发布大型内容项(即音频,视频和PDF)的地方,您必须重新使用相同的URL进行更新内容。
strtotime(日期('Y-m-d H:i:')。'00');没有给出绝对的一分钟间隔
是的,但它与服务器的时钟有关,而不是客户端的时钟。
除非时钟同步,否则无法在00:00强制执行到期。但是,如果您设置max-age = 60和age =`date('s'),那么这将适用于具有精确时钟的客户端,对于非同步客户端最多只能为60秒。
答案 1 :(得分:0)
是的,我同意symcbean。 Etag与时间到期无关。首先,服务器根据响应生成etag并将其发送给客户端。客户获得响应和etag。如果客户希望通过返回的etag再次获得响应,则服务器将再次计算响应并生成新的etag以与客户端请求中的etag进行比较。如果匹配,则发送304.否则直接发送带有新etag的响应。
上述描述的意思是服务器不会缓存任何响应的etag,表明Etag没有到期概念。