Каково ожидаемое поведение кэша, когда значения 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. Расчеты возраста.

Другие вопросы по тегам