Каково ожидаемое поведение кэша, когда значения Date и Expires остались в прошлом?
Довольно стандартный метод для определения поведения кэша в заголовках ответа заключается в Date
значение и Expires
значение. (Наряду с некоторой директивой управления кешем, такой как cache-control=public
).
Предполагая, что запрос сделан вовремя, скажем, сейчас:
Tue, 24 Jun 2014 13:36:05 GMT
Тогда стандартный ответ, который устанавливает значение кэша в 1 час, может включать следующие заголовки:
Date: Tue, 24 Jun 2014 13:36:05 GMT
Expires: Tue, 24 Jun 2014 14:36:05 GMT
Это будет (и должно) указывать любым промежуточным кешам или PoPs кэшировать ресурс в течение 1 часа.
Однако, что если оба Expires
значение и Date
ценность в прошлом. (Возможно, скажем, из-за ошибочных часов сервера).
Если мы рассмотрим еще один запрос, сделанный в то же время, то есть сейчас:
Tue, 24 Jun 2014 13:36:05 GMT
Что, если соответствующий ответ содержал следующие значения заголовка:
Date: Tue, 24 Jun 2014 11:10:00 GMT
Expires: Tue, 24 Jun 2014 11:44:00 GMT
Здесь оба значения уже прошли. Expires
значение в прошлом обычно было бы достаточно, чтобы вызвать no-cache
, но каков эффект от Date
Ценность в прошлом.
Должны ли реализации кэша использовать значение Date
рассчитать смещение из Expires
, а затем использовать это, чтобы создать значение срока действия сейчас + смещение?
RFC2616 Раздел даты
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
Не упоминает значение даты в прошлом
RFC2616 Истекает раздел
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html
Предполагает, что если Date === Expires
ответ уже истек.
Ни один из них, кажется, не упоминает случай, когда оба Date
а также Expires
уже прошло?
ОБНОВЛЕНИЕ / RFC2616 мертв
Дальнейшее чтение предполагает, что RFC2616 мертв и был заменен набором более конкретных RFC.
Новый RFC7234 - HTTP/1.1: Кэширование содержит время вычислений свежести, которое содержит следующее утверждение:
Если поле заголовка ответа Expires присутствует, используйте его значение минус значение поля заголовка ответа Date
Кажется, это точно определяет то, что описано выше - используйте значение expires:
expiry=(Expires - Date) + Now
В оригинальном RFC, похоже, нет никакого эквивалентного утверждения. Для тех, кто все еще следует RFC2616, подходит ли поведение отдельным поставщикам браузеров / кешей?
1 ответ
В 2616 году соответствующий раздел - 13.2.3. Расчеты возраста.