Является ли Cache-Control: must-revalidate обязательным для проверки всех запросов или только устаревших? - PullRequest
7 голосов
/ 27 сентября 2011

У меня беспорядок с этим заголовком, я прочитал, что Cache-Control:must-revalidate обязывает проверять все запросы с источником перед обработкой кэшированного элемента, но только устаревшие? или все неважно, несвежее или свежее? Я читал обе вещи в разных местах.

В чем разница с Cache-Control:no-cache? Потому что эти заголовки выглядят эквивалентно мне.

ОБНОВЛЕНИЕ 1: Я прочитал это из книги:

Заголовок Cache-Control: must-revalidate ответа сообщает кэш обойти механизмы расчета свежести и переоценить на каждом доступ

@ Питер О. указал, что говорит RFC. Так что эта старая книга не права.

ОБНОВЛЕНИЕ 2: В этом уроке: http://www.mnot.net/cache_docs/

no-cache - заставляет кэши отправлять запрос на исходный сервер для проверки перед выпуском кэшированной копии, каждый раз. Это полезно убедиться, что аутентификация соблюдается (в сочетании с публичный), или чтобы сохранить жесткую свежесть, не жертвуя всеми Преимущества кеширования.

must-revalidate - сообщает кешам, что они должны Повинуйтесь любой свежей информации, которую вы им даете о представлении. HTTP позволяет кешам обслуживать устаревшие представления под специальными условия; указав этот заголовок, вы сообщаете Вы хотите, чтобы он строго следовал вашим правилам.

1 Ответ

10 голосов
/ 27 сентября 2011

Раздел 14.9.4 HTTP / 1.1:

Когда в ответе, полученном кешем, присутствует директива must-revalidate, этот кеш НЕ ДОЛЖЕН использовать запись после того, как он устарел , чтобы ответить на последующий запрос, не проверив его сначала на сервере происхождения

Раздел 14.8 HTTP / 1.1:

Еслиответ включает в себя директиву управления кэшем «must-revalidate», кеш МОЖЕТ использовать этот ответ при ответе на последующий запрос.Но если ответ устарел , все кэши ДОЛЖНЫ сначала подтвердить его с помощью сервера происхождения ...

Таким образом, кажется, что только устаревшие ответы должны быть повторно проверены, если must-revalidateПолучено.

Для no-cache см. раздел 14.9.1:

Если в директиве no-cache не указано имя поля [как здесь], токэш НЕ ДОЛЖЕН использовать ответ для удовлетворения последующего запроса без успешной повторной проверки с сервером происхождения ...

Таким образом, no-cache применяется как к свежим, так и к устаревшим ответам.

РЕДАКТИРОВАТЬ:

Эта фраза может быть уместна здесь (раздел 13.3):

Когда в кеше есть устаревшая запись, которую он хотел бы использовать в качестве ответа на запрос клиента, онсначала нужно проверить с сервером происхождения (или, возможно, с промежуточным кешем с новым ответом) , чтобы убедиться, что его кэшированная запись все еще пригодна для использования.

Итак, must-revalidateвероятно актуально, когда кеш имеет промежуточные кеши, грехв противном случае кеш может проверять промежуточный кеш на наличие нового ответа, а не напрямую проверять исходный сервер.

...