可靠地设置 Etag

标签 php http header etag

我无法可靠地在用户浏览器上设置 Etag。当用户点击我的一个外部链接时,我想将文章 ID 设置到他们的 Etag 中(我也使用 cookie,但我想专门试验 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);

此外,您是否检查过通常的嫌疑人停止标题? Unicode 字节顺序标记对此非常恼火。 (忽略你是否可以看到你自己设置的其他标题)

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

相关文章:

http - golang http.Post 请求返回响应 404

php - Laravel 中的位置 header

http - 在Golang中为http请求指定网络接口(interface)

c# - 将 header 添加到 .Net 3.5 WCF 客户端

c++ - 如何使用默认标题和注释设置 Visual Studio?

php - 特殊字符替换为?

php - Mysql查询,更具体地说是用Laravel eloquent

php - 在路由中排除路径

php - 显示产品的计量单位

c++ - 适用于 Mac 的 C++ 中的 HTTP 查询