Різниця між відсутнім кешем та необхідним повторним оновленням


179

З RFC 2616

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

без кешу

Якщо директива no-cache не вказує ім'я поля, то кеш НЕ МОЖЕ використовувати відповідь для задоволення наступного запиту без успішної повторної перевірки з початковим сервером. Це дозволяє серверу-джерелу запобігати кешування навіть кешами, налаштованими для повернення застарілих відповідей на запити клієнтів.

Таким чином, він спрямовує агентів на повторну перевірку всіх відповідей.

У порівнянні з цим

необхідно повторно підтвердити

Коли в відповіді, отриманій кеш-пам'яткою, присутня директива, необхідна для повторної перевірки, цей КЕШ НЕ МОЖЕ НЕ використовувати запис після того, як він стає розмитим, щоб відповісти на наступний запит, попередньо не підтверджуючи його на початковому сервері

Таким чином, він спрямовує агентів на повторну перевірку несвіжих відповідей.

Зокрема, це стосується того no-cache, як насправді користувацькі агенти емпірично ставляться до цієї директиви?

Який сенс, no-cacheякщо є must-revalidateі max-age?

Дивіться цей коментар:

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

без кешу

Хоча ця директива звучить так, ніби вона вказує браузеру не кешувати сторінку, є тонка різниця. Відповідно до RFC, директива "без кешу" повідомляє браузеру, що він повинен перезавантажитися з сервером, перш ніж подавати сторінку з кеша. Відновлення - це акуратний прийом, який дозволяє додатку зберігати ширину смуги. Якщо сторінка, яку браузер кешував, не змінилася, сервер просто сигналізує про це, і сторінка відображається з кеша. Отже, браузер (теоретично, принаймні) зберігає сторінку в своєму кеші, але відображає її лише після повторної перевірки з сервером. На практиці IE і Firefox почали розглядати директиву no-cache так, ніби вона вказує браузеру навіть не кешувати сторінку. Ми почали спостерігати за такою поведінкою близько року тому.

Хтось отримав щось більш офіційне з цього приводу?

Оновлення

Директива, необхідна для повторної перевірки, повинна використовуватися серверами лише тоді, коли невдача запиту на представництво може призвести до неправильної роботи, наприклад, мовчазної невиконаної фінансової операції.

Це те, чого я ніколи до серця не приймав. RFC заявляє, що не слід використовувати легку переоцінку. Річ у тім, що для веб-служб вам доведеться негативно сприймати і вважати найгіршим для своїх невідомих клієнтських додатків. Будь-який затхлий ресурс може стати причиною проблеми.

І ще щось, що я щойно вважав, без Last-Modified або ETags, браузер може лише знову отримати весь ресурс. Однак, з ETags, я помітив, що Chrome принаймні здається, що він скасовується під час кожного запиту. Це змушує обидві ці директиви суперечити або принаймні погано названі, оскільки вони не можуть належним чином переосмислитись, якщо запит також не містить інших заголовків, які в будь-якому разі спричиняють "завжди перезавантажуватися".

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

Однак моє емпіричне тестування показало, що коли ETag або модифіковані дані заголовка включаються у відповіді, агенти завжди переосмислюються так чи інакше, незалежно від наявності must-revalidateзаголовка.

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

- Тож я нарешті позначу відповідь Гілі!


Тож теоретично різниця полягає у валідації - завжди проти валідації, якщо є несвіжою , тоді як на практиці відсутність кеша трактується певними браузерами, оскільки коментар, який ви цитували, говорить як ніколи не підтверджений … тому ви повинні зробити вибір того, хто з них використовувати виходячи з того, яку кешируючу поведінку ви насправді хочете досягти на практиці…
CBroe

Будь ласка, прочитайте greenbytes.de/tech/webdav/… і переконайтеся, чи пояснює це для вас.
Джуліян Решке


перевірити це дерево рішень для відповіді stackoverflow.com/a/49925190/3748498
pravdomil

Відповіді:


191

Я вважаю, що це must-revalidateозначає:

Щойно кеш закінчується, відмовтеся повертати користувачеві несвіжі відповіді, навіть якщо вони кажуть, що несвіжі відповіді прийнятні.

Тоді як no-cacheвипливає:

must-revalidate плюс той факт, що відповідь відразу стає несвіжим.

Якщо відповідь кешується протягом 10 секунд, то must-revalidateпочинається через 10 секунд, тоді як це no-cacheозначаєmust-revalidate на через 0 секунд.

Принаймні, це моє тлумачення.


2
Ось як я це зараз бачу. Цікава частина - мій останній пункт, без ETag або Last-Modified, агент не має нічого використовувати для перевірки того, що він має в кеші, і повинен завантажувати весь корисний вантаж знову. Тож, коли RFC каже, "переосмислити", що, ймовірно, означає, перезавантажити.
Люк Пуплетт

44
Що також означає max-age=0, must-revalidateі no-cacheє тотожними
Аншул

5
@Anshul, спершу я вважав, що ти маєш рацію, що "max-age = 0, треба переосмислити, а кеш-пам'ять однаковий", але дивіться відповідь Джеффрі Фокса, яка, схоже, вказує, що це не зовсім правильно.
Дон Хетч

2
@Anshul Ні, must-revalidateі no-cacheдля іншого відповіді мають інше значення: Якщо кешована відповідь є свіжою (тобто відповідь не закінчився), must-revalidateзмусить проксі-сервер подавати її відразу без повторної перевірки з сервером, тоді як з no-cacheпроксі-сервером потрібно повторно підтвердити кешована відповідь незалежно від свіжості. Джерело: "HTTP - остаточний посібник", сторінки 182-183.
Маттіас Браун

8
@MatthiasBraun Ах, я бачу джерело плутанини. Можливо, я повинен був писати no-cacheі max-age=0, must-revalidateоднакові
Anshul

24

max-age=0, must-revalidateі no-cacheне зовсім однакові. З must-revalidate, якщо сервер не відповідає на запит повторної перевірки, браузер / проксі повинен повертати помилку 504. З no-cache, він би просто показував кешований вміст, який, напевно, віддав перевагу користувачеві (краще мати щось несвіже, ніж взагалі нічого). Ось чому must-revalidateвін призначений лише для критичних операцій.


10
Не впевнений у своєму no-cacheтлумаченні. З RFC 7234 Директива відповідей "без кешу" вказує, що відповідь НЕ БУДЬ використовуватися для задоволення наступного запиту без успішної перевірки на сервері початків. Це дозволяє серверу походження заборонити кеш-пам'яті використовувати його для задоволення запиту, не звертаючись до нього, навіть кешами, налаштованими для надсилання застарілих відповідей. Це схоже на обмеження дляmust-revalidate
Аншул

9
Чи є у Джефрі докази того, що реалізація поводиться так, як він описав?
OrangeDog

Я вважаю, що ця відповідь є правильною для проксі / фунт-серверів. Але дійсно, браузери не повертають 504 у такому випадку.
Yann Dìnendal

Так must-validateзначитьmust-refresh
Simon_Weaver

15

З інтерпретацією Джефрі Фокса про те no-cache, що я перевірив хром 52.0.2743.116 м, результат показує, що no-cacheтака ж поведінка, як must-revalidateі всі, НЕ використовуватиме локальний кеш, коли сервер недоступний, і всі вони будуть використовувати кеш під час натискання Назад браузера / Кнопка вперед, коли сервер недоступний. Як і вище, я думаю, що max-age=0, must-revalidateце ідентично no-cache, принаймні в реалізації.


Чи використовуватиме Chrome локальний кеш, коли сервер доступний для повторної перевірки? (тобто "If-Modified-Since"). В обох випадках?
Багатий

-2

Я думаю, що існує різниця між max-age=0, must-revalidateта no-cache:

У must-revalidateвипадку, коли клієнту дозволяється надіслати If-Modified-Sinceзапит і подати відповідь з кешу, якщо 304 Not Modifiedвін повернеться.

У no-cacheвипадку, коли клієнт не повинен кешувати відповідь, тому його не слід використовувати If-Modified-Since.


6
Але no-cacheце не означає no-store- з no-cache, ресурс все ще може кешуватися в клієнті; перед тим, як його використовувати, його потрібно повторно затвердити?
Арон

4
Ви плутаєте no-cacheі no-store. no-cacheозначає , що ресурс повинен бути підтверджуватися . Revalidate включає можливість використання умовних запитів, таких як If-None-Matchі If-Modified-Since.
Жюль Сем. Рандольф

1
@JulesRandolph: ти можеш мати рацію. У вас є тести / демонстрації? Усі суперечливі твердження про відсутність доказів на цьому питанні неприємні. Навіть прийнята відповідь просто говорить "Принаймні, це моє тлумачення". Я можу встановити пробне ліжко і розмістити його тут, якщо отримаю трохи часу.
Багатий
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.