Яка різниця між кеш-керуванням: max-age = 0 і без кешу?


Відповіді:


597

У мене було те саме запитання, і я знайшов інформацію в своїх пошуках (ваше запитання з'явилося як один із результатів). Ось що я визначив ...

До Cache-Controlзаголовка є дві сторони . Одна сторона - це те, куди він може надсилати веб-сервер (він же "початковий сервер"). Інша сторона - це те, куди він може пересилати браузер (він же "користувальницький агент").


Коли надсилається сервером походження

Я вважаю, що max-age=0просто повідомляє кеші (і агенти користувачів), що відповідь є несвіжою під час керування, і тому вони ДОЛЖНІ переосмислити відповідь (наприклад, із If-Not-Modifiedзаголовком) перед використанням кешованої копії, тоді як, no-cacheкаже, вони ПОВИННІ перезавантажитись перед використанням кешованого копія. Від 14.9.1 Що таке кешоване :

без кешу

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

Іншими словами, кеші можуть іноді вирішити використовувати несвіжий відгук (хоча я вважаю, що їм доведеться потім додавати Warningзаголовок), але no-cacheвони говорять, що їм заборонено використовувати несвіжу відповідь незалежно від того. Можливо, ви хочете, щоб SHOULD -ревалідизувати поведінку, коли генерується статистика бейсболу на сторінці, але ви хочете ОБОВ'ЯЗКОВО змінити поведінку, коли ви створили відповідь на покупку електронної комерції.

Хоча ви правильний у своєму коментарі, коли кажете, що no-cacheце не повинно перешкоджати збереженню, це може бути фактично іншою відмінністю при використанні no-cache. Я натрапив на сторінку, демістифіковані директиви управління кешем , яка говорить (я не можу порушити його правильність):

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

...

Зауважте, що запізнілий "кеш-контроль: без кешу" також почав поводитися як директива "не зберігати".

Як осторонь, мені здається, що в Cache-Control: max-age=0, must-revalidateосновному має означати те саме, що і Cache-Control: no-cache. То, може, це спосіб отримати ОБОВ'ЯЗКОВО скасувати поведінку no-cache, уникаючи при цьому явної міграції, no-cacheщоб зробити те саме, що no-store(тобто. Жодного кешування)?


Після надсилання агентом користувача

Я вважаю , що відповідь шахкалпеша стосується сторони агента користувача. Ви також можете подивитися на 13.2.6 розрізнення кількох відповідей .

Якщо користувальницький агент надсилає запит з Cache-Control: max-age=0(ака. "Кінцева ревалідація"), то кожен кеш по цьому шляху буде повторно підтверджувати свою запис кеша (наприклад, із If-Not-Modifiedзаголовком) аж до сервера початківців. Якщо відповідь тоді 304 (Не змінено), кешоване об'єкт може бути використаний.

З іншого боку, надсилання запиту з Cache-Control: no-cache(ака. "Перезавантаження в кінці") не скасовується, і сервер НЕ МОЖЕТЕ використовувати кешовану копію при відповіді.


9
Чи не кеш-контроль: max-age = 0, треба повторно підтвердити, проксі-повторне підтвердження було б точною еквівалентністю без кешу?
Дідьє А.

1
Чудова відповідь, я пішов читати статтю, на якій ви знаходитесь на сайті, але сторінка більше не діє. palisade.plynt.com/isissue/2008Jul/cache-control-attributes
Крейг Лондон

7
Дякую, @CraigLondon Я перенаправив його на кешовану версію.
Майкл Кребс

2
must-revalidateНЕ означає, що це те саме, що no-cacheабо no-store. Останній обходить кеш-пам'ять взагалі, але перший просто говорить, що кеш потрібно завжди перевіряти на свіжість, але якщо він все ще є актуальним, його можна використовувати, зберігаючи пропускну здатність. Останнє змушує весь час завантажувати кінцеві дані, займаючи непотрібну пропускну здатність і затримуючи відповіді.
Патанджалі

3
@Patanjali no-cache не "цілком обходить кеш-пам'ять" або "примушує повне завантаження в кінці до кінця", принаймні, не у всіх браузерах. Специфікація говорить лише про те, що браузер повинен перевірити кеш.
Франклін Ю

57

макс-вік = 0

Це еквівалентно натисканню Refresh (Оновити) , що означає, дайте мені останню копію, якщо я вже не маю останньої копії.

без кешу

Це утримує Shift під час натискання кнопки Refresh (Оновити).


31
Це неправильно. shift-refresh - це важке оновлення, яке більше схоже наno-store
Michael

3
Перевірено в Firefox 45.0, який, як і Chrome 49.0.2623.87 м, також надсилає "Прагму: без кешу" при Shift + Refreshing.
Cees Timmerman

34

Старе питання зараз, але якщо хтось інший стикається з цим шляхом пошуку, як і я, виявляється, що IE9 використовуватиме це для налаштування поведінки ресурсів при використанні кнопок назад і вперед. Якщо використовується max-age = 0 , браузер використовуватиме останню версію під час перегляду ресурсу на натисканні назад / вперед. Якщо не використовується кеш-пам'ять , ресурс буде змінено.

Детальніші відомості про кешування IE9 можна побачити в цій публікації блогу кешування msdn .


4
Аналогічно, IE 8 стикається з усіма видами "не вдалося завантажити", коли без кешу використовується https. Запропоновані резолюції іноді включають зміну заголовків до max-age = 0
Роберт Кріст,

28

У моїх останніх тестах з IE8 та Firefox 3.5, здається, що обидва відповідають стандартам RFC. Однак вони відрізняються своєю "дружелюбністю" до початкового сервера. IE8 розглядає no-cacheвідповіді з тією ж семантикою, що і max-age=0,must-revalidate. Однак, здається, Firefox 3.5 вважається no-cacheрівноцінним no-store, що відповідає ефективності та використанню пропускної здатності.

Кеш кальмарів за замовчуванням, здається, ніколи нічого не зберігає із no-cacheзаголовком, як Firefox.

Моєю порадою було б встановити public,max-age=0для нечутливих ресурсів, які ви хочете перевірити на свіжість при кожному запиті, але все ж дозволити переваги кешування для пропускної здатності та пропускної здатності. Для предметів з користувачем, що мають однакове врахування, використовуйте private,max-age=0.

Я б уникнув використання no-cacheцілком, оскільки, здається, деякі браузери та популярні кеші були зведені на функціональний еквівалент no-store.

Крім того, не емулюйте Akamai та Limelight. Хоча вони по суті керують масивними масивами кешування як їх основний бізнес, і вони повинні бути експертами, вони насправді зацікавлені в тому, щоб викликати завантаження більшої кількості даних із своїх мереж. Google може бути і не найкращим вибором для емуляції. Вони ніби використовують max-age=0або no-cacheвипадковим чином залежно від ресурсу.


2
Найкраща відповідь на вміст, захищений паролем. private,max-age=0.
дата

21
макс-вік
    Коли проміжний кеш змушений за допомогою директиви max-age = 0 повторно підтверджувати 
власний запис у кеш, і клієнт надав власний валідатор у запиті 
наданий валідатор може відрізнятися від валідатора, який зараз зберігається з записом кешу. 
У цьому випадку кеш МОЖЕ використовувати будь-який валідатор, щоб зробити власний запит без 
що впливає на семантичну прозорість. 

    Однак вибір валідатора може вплинути на продуктивність. Найкращий підхід - це
проміжний кеш, щоб використовувати власний валідатор при поданні свого запиту. Якщо сервер відповідає
з 304 (Не модифіковано), то кеш може повернути клієнтові свою вже перевірену копію 
з 200 (ОК) відповіддю. Якщо сервер відповідає з новим об'єктом і валідатором кешу,
однак проміжний кеш може порівнювати повернутий валідатор з наданим у 
запит клієнта, використовуючи функцію сильного порівняння. Якщо валідатор клієнта є
дорівнює початковому серверу, тоді проміжний кеш просто повертає 304 (Ні 
Змінено). В іншому випадку він повертає нову суть із відповіддю 200 (ОК).

    Якщо запит включає директиву no-cache, він НЕ повинен включати min-fresh, 
макс-несвіжий або макс-вік. 

люб’язно: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4

Не сприймайте це як відповідь - мені доведеться його прочитати, щоб зрозуміти справжнє його використання :)


12

Я навряд чи є експертом з кешування, але Марк Ноттінгем є. Ось його документи з кешування . Він також має чудові посилання в розділі "Посилання".

Виходячи з того, що я читаю ці документи, схоже, що це max-age=0може дозволити кешу надіслати кешовану відповідь на запити, що надходили в "той самий час", коли "той самий час" означає досить близько один до одного, вони виглядають одночасно з кешем, але no-cacheне .


Добре, але на практиці чи справді це роблять будь-які браузери?
Pacerier

3
@Pacerier Я думаю, що це більше для кешування проксі-серверів, таких як Varnish, Squid, Traffic тощо
Hank Gay

12

До речі, варто відзначити, що деякі мобільні пристрої, зокрема продукти Apple, такі як iPhone / iPad, повністю ігнорують заголовки, такі як не кеш-пам'ять, не-магазин, термін дії: 0, або що-небудь інше, ви можете спробувати змусити їх повторне використання не закінчився сторінки форм.

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

Я просто додаю це у випадку, якщо хтось приходить і не може зрозуміти, чому вони отримують помилки сеансу, особливо з iphone та ipads, які, безумовно, є найгіршими правопорушниками в цій області.

Я зробив досить обширну перевірку налагодження з цією проблемою, і це мій висновок, що пристрої повністю ігнорують ці директиви.

Навіть при регулярному використанні я виявив, що деякі мобільні телефони також повністю не перевіряють наявність нових версій через, скажімо, термін дії: 0, потім перевіряють останні модифіковані дати, щоб визначити, чи слід отримувати нову.

Це просто не буває, тому те, що я змушений був зробити, - це додавати рядки запитів до файлів css / js, які мені потрібні, щоб примусити оновлення, що обманює дурні мобільні пристрої, щоб думати, що це файл, якого немає, наприклад: my .css? v = 1, тоді v = 2 для оновлення css / js. Це багато в чому працює.

Браузери користувачів також, до речі, якщо залишити їх за замовчуванням, станом на 2016 рік, як я постійно виявляю (ми робимо багато змін і оновлень на нашому сайті) також не перевіряють останні змінити дати на таких файлах, але запит рядовий метод виправляє цю проблему. Це те, що я помітив у клієнтів та офісних людей, які, як правило, використовують основні стандартні стандартні налаштування користувачів у своїх браузерах і не знають про проблеми кешування з css / js тощо, майже незмінно не можуть отримати новий css / js на зміну, що означає, що за замовчуванням для своїх браузерів, в основному MSIE / Firefox, не роблять того, про що їм говорять, вони ігнорують зміни та ігнорують останні змінені дати та не підтверджують, навіть якщо явно встановлено Expires: 0.

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


css і js є підходящими кандидатами для кешування, як і у виробничих системах, вони насправді не повинні часто змінюватися. Однак кешування для них під час розвитку - це біль, тому що ця діяльність може вимагати частих примусових помилок кеш-пам'яті. Але якщо не можна використовувати різні параметри для різних середовищ, виробничі вимоги повинні мати прецедент, оскільки це має найбільший ефект, оскільки набагато більша кількість доступу дозволить зберегти пропускну здатність, порівняно з кількома оновленнями Ctrl-F5, які матимуть деякі розробники зробити. Однак запити даних у режимі реального часу вимагають правильного кеш-керування.
Патанджалі

0

Одне, що (на диво) не було згадано - це те, що запит може явно вказувати на те, що він буде приймати застарілі дані, використовуючи max-staleдирективу. У такому випадку, якщо сервер відповів max-age=0, кеш буде просто вважати відповідь несвіжою і був би вільний використовувати його для задоволення запиту клієнта [який вимагав потенційно несвіжих даних]. На противагу цьому, якщо сервер надсилає, no-cacheщо дійсно козирує будь-який запит клієнта (з max-stale) щодо несвіжих даних, оскільки кеш ОБОВ'ЯЗКОВО скасувати.


-2

Різниця полягає в тому, що no-cache (no-store на Firefox) запобігає будь-який тип кешування. Це може бути корисно для запобігання запису сторінок із захищеним вмістом на диск та для сторінок, які завжди повинні оновлюватися, навіть якщо їх повторно відвідують за допомогою кнопки "назад".

max-age = 0 вказує на те, що запис кешу необов’язковий і вимагає повторної перевірки, але не запобігає кешування. Часто браузери перевіряють ресурси лише один раз за сеанс роботи веб-переглядача, тому вміст може не оновлюватися, поки сайт не буде відвідано в новому сеансі.

Зазвичай веб-переглядачі не видалятимуть записи кеш-пам’яті, що втратили чинність, якщо тільки вони не отримають місця для нового вмісту, коли кеш браузера заповнений. Використовуючи no-store, no-cache дозволяє чітко видалити запис із кешу.


9
Наскільки я розумію, "no-cache" НЕ передбачається перешкоджати збереженню ("no-store" - це правильний спосіб досягти цього). Чи інтерпретують певні веб-переглядачі "не-кеш" як "не-магазин"? Це пояснило б, чому "max-age = 0" використовується замість просто "без кешу"
rubyruy

3
Це неправильно. Дивись вище. Деякі веб-переглядачі / сервери можуть вирішити впровадити кеш-пам'ять як не-магазин, але не всі.
Джеремі Кауффман

4
Єдиний безпечний спосіб - це використовувати, max-age=0якщо ви маєте на увазі, що кешування дозволено, але ресурс повинен бути повторно підтверджений і no-storeякщо ви взагалі не хочете, щоб відповідь зберігалася в кеші. no-cacheВипадковим чином позначені для позначення будь-якої з них в залежності від призначеного для користувача агента постачальника і номер версії і протоколу передачі.
Мікко Ранталайнен

Коли Firefox не використовує магазин?
Cees Timmerman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.