Да, ответ 304 может содержать новый max-age
(или ETag, или другие заголовки ответа, если на то пошло).
Я провел эксперимент с использованием Firefox 4, чтобы проверить, соблюдается ли исходный максимальный возраст или новый, и получил ответ, что новый max-age
соблюдается, поэтому вы сможете реализовать то, что хотите.
Важно помнить, что max-age
относится к заголовку ответа Date
, а не Last-Modified
, поэтому всякий раз, когда ваш сервер устанавливает директиву max-age
на 24 часа, он говорит: «Через 24 часа». Итак, если это то, что вы хотите, вам вообще не придется менять свой max-age
, просто всегда возвращайте 86400.
Во всяком случае, вот обзор и дамп моего эксперимента. Обычно я попадаю на тестовый URL, который устанавливает ETag и устанавливает max-age
равным 120 секундам. Соответственно, сервер вернул страницу с такими заголовками ответа:
HTTP/1.1 200 OK
Date: Tue, 14 Jun 2011 23:48:51 GMT
Cache-Control: max-age=120
Etag: "901ea3d0ac9303ae4855a09676f96701"
Last-Modified: Mon, 13 Jun 2011 22:20:03 GMT
Затем я повторил нажатие «Enter» в адресной строке, чтобы загрузить страницу (но без принудительной перезагрузки). Сетевого трафика не было, поскольку Firefox неоднократно перезагружал страницу из кеша. Затем, по прошествии 120 секунд, в следующий раз, когда я нажму Enter, Firefox вместо этого отправил на сервер условный GET, как и следовало ожидать. Запрос и ответ от сервера были:
GET /example HTTP/1.1
If-Modified-Since: Mon, 13 Jun 2011 22:20:03 GMT
If-None-Match: "901ea3d0ac9303ae4855a09676f96701"
HTTP/1.1 304 Not Modified
Date: Tue, 14 Jun 2011 23:50:54 GMT
Etag: "901ea3d0ac9303ae4855a09676f96701"
Cache-Control: max-age=240
Обратите внимание, что в ответе 304 сервер изменил max-age
с 120 секунд до 240.
Итак, большой вопрос: что произойдет через 120 секунд? Будет ли Firefox уважать новый max-age
и продолжать загружать страницу из кеша, или он попадет на сервер? Ответ заключается в том, что он продолжал загружать страницу из кеша и не запрашивал повторно до тех пор, пока не было достигнуто 240 секунд:
GET /example HTTP/1.1
If-Modified-Since: Mon, 13 Jun 2011 22:20:03 GMT
If-None-Match: "901ea3d0ac9303ae4855a09676f96701"
HTTP/1.1 304 Not Modified
Date: Tue, 14 Jun 2011 23:54:56 GMT
Etag: "901ea3d0ac9303ae4855a09676f96701"
Cache-Control: max-age=240
Я повторил еще один 240-секундный цикл, и все заработало, как и следовало ожидать. Надеюсь, это ответ на ваш вопрос.
В RFC объясняется, как должны выполняться вычисления возраста и как остальные параметры Cache-Control работают. Нет никакой гарантии, что каждый браузер и прокси будут следовать правилам, но на данный момент HTTP 1.1 довольно старый, и можно ожидать, что большинство из них будут работать так же, как Firefox.
(Примечание: для краткости в этих примерах дампа я удалил нерелевантные заголовки, такие как host, connection / keep-alive, кодировка / длина / тип контента, пользовательский агент и т. д.)
person
joelhardi
schedule
15.06.2011