Я управляю кешированием HTTP в своих приложениях. И это не работает, как мне кажется. Давайте на конкретном примере:Как работает максимальный возраст HTTP и срок действия кеша через некоторое время?
С первого служить моей PHP страницы служу следующие HTTP заголовки:
HTTP/1.1 200 OK
Date: Mon, 12 Dec 2016 16:39:33 GMT
Server: Apache/2.4.9 (Win64) PHP/5.5.12
Expires: Tue, 01 Jan 1980 19:53:00 GMT
Cache-Control: private, max-age=60, pre-check=60
Last-Modified: Mon, 12 Dec 2016 15:57:25 GMT
Etag: "a2883c859ce5c8153d65a4e904c40a79"
Content-Language: en
Content-Length: 326
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Мое приложение управлять проверку ETags и отправить 304, если ничего не изменилось, и когда вы обновите страницу в браузере (F5), вы получите (если ничего не изменилось на стороне сервера):
HTTP/1.1 304 Not Modified
Date: Mon, 12 Dec 2016 16:43:10 GMT
Server: Apache/2.4.9 (Win64) PHP/5.5.12
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
Поскольку я служу Cache-Control: private
с max-age=60
я бы ожидать, что после одной минуты кэш будет считаться устаревшим по б rower, и он запросит новую копию (эквивалент перезагрузки Ctrl + F5), но кеш остается действительным через несколько дней после того, как он max-age
.
Я не понял этот механизм HTTP? Я посылаю что-то неправильно или, возможно, что-то пропустил?
@ Дагон Да, я знаю, но в моем примере через 1 минуту F5 не запрашивал новую копию (например, Ctrl + F5)? На данный момент через 3 дня после того, как F5 по-прежнему отвечает с 304, как если бы кеш по-прежнему был недопустимым ... – AlexV
это не может быть кеш браузера, могут быть другие кеши между сервером и клиентом, такие как ISP. И никто не обязан следовать «правилам» –
Зачем загружать новую копию текущего, которую вы можете переустановить? В этом весь смысл 304s, чтобы сохранить вас, что загрузка ресурса не изменилась, и у вас все еще есть кешированная копия. –