Разница между no-cache и обязательным подтверждением

Из RFC 2616

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1

не-кэш

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

Таким образом, он направляет агенты для проверки всех ответов.

По сравнению с

нужно обязательно перепроверять

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

Таким образом, он направляет агенты для проверки устаревших ответов.

В частности, что касается no-cache, это как пользовательские агенты на самом деле, эмпирически относятся к этой директиве?

Какая точка no-cache, если там must-revalidate и max-age?

Смотрите этот комментарий:

http://palpapers.plynt.com/issues/2008Jul/cache-control-attributes/

не-кэш

Хотя эта директива звучит так, будто она инструктирует браузер не кешировать страницу, это тонкая разница. Директива "no-cache", согласно RFC, сообщает браузеру, что он должен сервер, прежде чем обслуживать страницу из кеша. Переопределение - это аккуратный метод, позволяющий приложению сохранять ширину полосы. Если страница, которую кешированный браузер не изменился, сервер просто сигнализирует что в браузере и странице отображается из кеша. Следовательно, браузер (теоретически, по крайней мере) хранит страницу в кеше, но отображает его только после повторной проверки с сервером. На практике IE и Firefox начали рассматривать директиву no-cache, как будто это инструктирует браузер не кэшировать страницу. Мы начали наблюдать это поведение около года назад. Мы подозреваем, что это изменение было вызванное широко распространенным (и неправильным) использованием этой директивы для предотвратить кеширование.

У кого-нибудь есть что-то более официальное в этом вопросе?

Update

Директива must-revalidate должна использоваться серверами тогда и только тогда, когда отказ в проверке запроса в представлении может привести к неправильной работе, такой как незавершенная финансовая транзакция без изменений.

Это то, что я до сих пор не принимал к сердцу. RFC заявляет, что не следует использовать обязательную переоценку. Дело в том, что с помощью веб-сервисов вы должны принять отрицательный взгляд и принять худшее для своих неизвестных клиентских приложений. Любой устаревший ресурс может вызвать проблемы.

И что-то еще, что я только что рассмотрел, без Last-Modified или ETags, браузер может снова извлечь весь ресурс. Однако с помощью ETags я заметил, что Chrome по крайней мере, похоже, проверяет каждый запрос. Это делает обе эти директивы спорными или, по крайней мере, плохо названными, так как они не могут должным образом повторить проверку, если в запрос не включены другие заголовки, которые затем приводят к тому, что они всегда будут всегда проверяться.

Я просто хочу сделать эту последнюю точку более ясной. Просто установив must-revalidate, но не включая ETag или Last-Modified, агент может получить контент снова, так как ему нечего посылать на сервер для сравнения.

Тем не менее, мое эмпирическое тестирование показало, что когда ETAG или измененные данные заголовка включены в ответы, агенты всегда повторяются в любом случае независимо от наличия заголовка must-revalidate.

Таким образом, точка must-revalidate заключается в том, чтобы принудительно "обходить кеш", когда она устарела, что может произойти только тогда, когда вы установили время жизни/возраст, таким образом, если must-revalidate задан в ответе без возраста или другие заголовки, он фактически становится эквивалентным no-cache, так как ответ будет считаться сразу же устаревшим.

- Итак, я собираюсь наконец отметить ответ Гили!

Ответ 1

Я считаю, что must-revalidate означает "после истечения срока действия кэша, отказываются возвращать устаревшие ответы пользователю, даже если говорят, что устаревшие ответы приемлемы". Принимая во внимание, что no-cache подразумевает must-revalidate плюс тот факт, что ответ сразу затухает.

Если ответ кэшируется в течение 10 секунд, то must-revalidate срабатывает через 10 секунд, тогда как no-cache подразумевает must-revalidate через 0 секунд.

По крайней мере, моя интерпретация.

Ответ 2

max-age=0, must-revalidate и no-cache не совсем идентичны. Если must-revalidate, если сервер не отвечает на запрос повторной проверки, браузер/прокси должен возвращать ошибку 504. С помощью no-cache он просто отобразит содержимое в кэше, которое, вероятно, будет предпочтительнее для пользователя (лучше иметь что-то черствое, чем ничего). Вот почему must-revalidate предназначен только для критических транзакций.

Ответ 3

С интерпретацией Jeffrey Fox о no-cache, я протестировал под chrome 52.0.2743.116 m, результат показывает, что no-cache имеет то же поведение, что и must-revalidate, все они будут NOT используйте локальный кеш, когда сервер недоступен, и все они будут использовать кеш при нажатии кнопки "Назад/Вперед" браузера, когда сервер недоступен. Как и выше, я думаю, что max-age=0, must-revalidate идентичен no-cache, по крайней мере, в реализации.