我在可靠地在用户浏览器上设置Etag时遇到麻烦。当用户单击我的外部链接之一时,我想将商品ID设置到他们的Etag中(我也使用Cookie,但ID则想专门测试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);

?>

最佳答案

您应该将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);

另外,您是否检查了通常的可疑 header 停止 header ? Unicode字节顺序标记对此非常烦人。 (不管您是否看到自己设置的其他标题)

关于PHP可靠地设置Etag,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3465955/

10-11 23:27
查看更多