Я управляю кэшированием 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
Я ожидал бы, что через одну минуту кеш будет считаться устаревшим браузером, и он будет запрашивать новую копию (эквивалент перезагрузки Ctrl + F5), но вместо этого кеш остается в силе через несколько дней после max-age
,
Я неправильно понял механизм HTTP? Я отправляю что-то неправильно или, может быть, что-то пропускаю
Если кэшированный ответ находится в пределах максимального возраста, то он считается свежий.
Если он превышает максимальный возраст, то считается несвежий.
Если браузеру нужен ресурс, и у него есть свежая копия в кеше, он будет использовать его, не проверяя сервер.
Если в браузере есть устаревшая копия, он будет проверять ее на сервере (в данном случае, используя Etags), чтобы определить, нужна ли ему новая копия, и кэшированная копия все еще в порядке.
Других решений пока нет …