Я пытался установить 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');
не дает абсолютный интервал в одну минуту.
Есть ли другое решение?
Я изо всех сил пытаюсь понять ваш вопрос. Я думаю, что большая часть причины в том, что Etags не имеет ничего общего со временем истечения. Вы можете использовать Etag в качестве прокси на время истечения, но это скорее побеждает точку.
Если вы предоставили контент с правильной информацией о кешировании, клиент не будет делать условный запрос до тех пор время кеша истекло.
только Сценарий, в котором имеет смысл использовать Etags для управления кэшированием, — это когда вы публикуете большие элементы контента (например, аудио, видео и PDF), где вы должны повторно использовать один и тот же URL-адрес для обновленного контента.
strtotime (дата (‘Y-m-d H: i:’). ’00’); не дает абсолютный интервал в одну минуту
Да, это так, но это относительно часов сервера, а не часов клиента.
Невозможно установить истечение точно в 00, если часы не синхронизированы. Однако, если вы установите max-age = 60 и age = `date (‘s’), тогда это будет работать для клиентов с точными часами и только до 60 секунд для несинхронизированных клиентов.
Да, я согласен с Symcbean. Этаг не имеет ничего общего со временем истечения. Сначала сервер генерирует etag для ответа и отправляет их клиенту. Клиент получает ответ и etag. Если клиент захочет получить ответ снова с возвращенным etag, сервер снова вычислит ответ и сгенерирует новый etag для сравнения с etag из запроса клиента. Если совпадение, отправьте 304. В противном случае отправьте ответ с новым etag напрямую.
Под описанием, приведенным выше, я имею в виду, что сервер не кэширует etag любого ответа, указывая на то, что в терминах Etag отсутствует концепция истечения срока действия.