ETAG -Как установить время истечения?

Я пытался установить ETAG на моей странице PHP, используя следующий код,

$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'); не дает абсолютный интервал в одну минуту.

Есть ли другое решение?

0

Решение

Я изо всех сил пытаюсь понять ваш вопрос. Я думаю, что большая часть причины в том, что Etags не имеет ничего общего со временем истечения. Вы можете использовать Etag в качестве прокси на время истечения, но это скорее побеждает точку.

Если вы предоставили контент с правильной информацией о кешировании, клиент не будет делать условный запрос до тех пор время кеша истекло.

только Сценарий, в котором имеет смысл использовать Etags для управления кэшированием, — это когда вы публикуете большие элементы контента (например, аудио, видео и PDF), где вы должны повторно использовать один и тот же URL-адрес для обновленного контента.

strtotime (дата (‘Y-m-d H: i:’). ’00’); не дает абсолютный интервал в одну минуту

Да, это так, но это относительно часов сервера, а не часов клиента.

Невозможно установить истечение точно в 00, если часы не синхронизированы. Однако, если вы установите max-age = 60 и age = `date (‘s’), тогда это будет работать для клиентов с точными часами и только до 60 секунд для несинхронизированных клиентов.

2

Другие решения

Да, я согласен с Symcbean. Этаг не имеет ничего общего со временем истечения. Сначала сервер генерирует etag для ответа и отправляет их клиенту. Клиент получает ответ и etag. Если клиент захочет получить ответ снова с возвращенным etag, сервер снова вычислит ответ и сгенерирует новый etag для сравнения с etag из запроса клиента. Если совпадение, отправьте 304. В противном случае отправьте ответ с новым etag напрямую.

Под описанием, приведенным выше, я имею в виду, что сервер не кэширует etag любого ответа, указывая на то, что в терминах Etag отсутствует концепция истечения срока действия.

0