2010-08-12 54 views
6

即时通讯在用户的浏览器上可靠地设置Etag。当用户点击我的一个外部链接时,我想将文章ID设置为他们的Etag(我也使用Cookie,但是ID喜欢专门试验Etag来测试其可靠性)。PHP设置Etag可靠

当同一用户在几个小时/天后返回我的网站时,我希望能够读取Etag值并将其用于东西。

我可以在初始点击时设置一个Etag,但是当用户返回Etag值时消失了。我认为它过期了或什么的。下面是代码我一直在努力:

<? 

$time = 1280951171; 
$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'); 
} else { 
    header("Last-Modified: $lastmod"); 
    header("ETag: $etag"); 
} 

print_r($_SERVER); 

?> 

回答

5

你应该用双引号来包裹你的etag(为纽带Codler提到所示):

'"' . $etag . '"' 

我认为这不太可能解决您的问题,但您可能想要

header('Not Modified',true,304); 

代替

header('HTTP/1.0 304 Not Modified'); 

随着PHP 5.4的有一个更好的方式与http_response_code做到这一点:

http_response_code(304); 

另外,你检查的通常的嫌疑人停止头? Unicode字节顺序标记非常烦人。 (忽略如果你可以看到你自己设置的其他头文件)

+0

真棒的东西! “”就是我想念的:-)谢谢! – 2010-08-12 11:40:24

+0

实际上,'header('Not Modified',true,304)''语法导致我的Wordpress网站上出现“500 Internal Server Error”。原始语法似乎更安全。 – Sphinxxx 2014-12-10 02:18:56

+1

@Sphinxxx不幸的是,对于大多数使用HTTP/1.1的Web用户代理来说这是错误的(这就是为什么我建议不要对其进行硬编码的原因)。我已经更新了这篇文章,在PHP 5.4中包含了一个'新'功能,这比其他的更好。改为尝试。 – 2014-12-10 09:44:01

-3
+0

有趣的链接,谢谢 - 虽然我们只是使用一个Web服务器,所以它应该有希望是一个体面的后备计划 – 2010-08-12 08:49:58

+3

这只有在ETag以某种方式生成。 “ETags的问题在于它们*通常*是使用属性来构建的,这些属性使它们对于托管站点的特定服务器而言是唯一的。” @PeterSmith正在指定他自己的ETags,并且很容易避免这样做。 – 2012-09-16 20:51:40

+6

@Codler,当你正确使用它们时,etags是可靠的,如果你错误地使用它们,etags是不可靠的。 – Pacerier 2013-07-28 15:27:41