Заголовок Last-Modified должен содержать дату реального изменения представления страницы. Вычислять «вчерашнее число» при каждом запросе неверно. В PHP заголовки отправляются до HTML и другого вывода, а не внутри блока head.
Пример для страницы, целиком зависящей от одного файла:
<?php
$modified = filemtime(__FILE__);
if ($modified !== false) {
header(
"Last-Modified: " . gmdate("D, d M Y H:i:s", $modified) . " GMT"
);
$since = $_SERVER["HTTP_IF_MODIFIED_SINCE"] ?? null;
$sinceTime = $since === null ? false : strtotime($since);
$method = $_SERVER["REQUEST_METHOD"] ?? "GET";
if (in_array($method, ["GET", "HEAD"], true)
&& !isset($_SERVER["HTTP_IF_NONE_MATCH"])
&& $sinceTime !== false
&& $sinceTime <= time()
&& $modified <= $sinceTime) {
http_response_code(304);
exit;
}
}
Если результат зависит от базы, шаблонов, пользователя или других файлов, используйте время изменения самого содержимого либо не отправляйте этот заголовок. При использовании ETag обработка If-None-Match имеет приоритет. Дата обновления статьи и HTTP Last-Modified решают разные задачи.
Документация: HTTP Last-Modified.