ETAG-如何设定到期时间?

时间:2014-09-26 10:39:13

标签: php caching etag

我尝试使用以下代码在我的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');不会给出绝对的一分钟间隔。

还有其他解决方案吗?

2 个答案:

答案 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没有到期概念。