Відповіді:
У мене було те саме запитання, і я знайшов інформацію в своїх пошуках (ваше запитання з'явилося як один із результатів). Ось що я визначив ...
До 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
(ака. "Перезавантаження в кінці") не скасовується, і сервер НЕ МОЖЕТЕ використовувати кешовану копію при відповіді.
must-revalidate
НЕ означає, що це те саме, що no-cache
або no-store
. Останній обходить кеш-пам'ять взагалі, але перший просто говорить, що кеш потрібно завжди перевіряти на свіжість, але якщо він все ще є актуальним, його можна використовувати, зберігаючи пропускну здатність. Останнє змушує весь час завантажувати кінцеві дані, займаючи непотрібну пропускну здатність і затримуючи відповіді.
no-cache
не "цілком обходить кеш-пам'ять" або "примушує повне завантаження в кінці до кінця", принаймні, не у всіх браузерах. Специфікація говорить лише про те, що браузер повинен перевірити кеш.
макс-вік = 0
Це еквівалентно натисканню Refresh (Оновити) , що означає, дайте мені останню копію, якщо я вже не маю останньої копії.
без кешу
Це утримує Shift під час натискання кнопки Refresh (Оновити).
no-store
Старе питання зараз, але якщо хтось інший стикається з цим шляхом пошуку, як і я, виявляється, що IE9 використовуватиме це для налаштування поведінки ресурсів при використанні кнопок назад і вперед. Якщо використовується max-age = 0 , браузер використовуватиме останню версію під час перегляду ресурсу на натисканні назад / вперед. Якщо не використовується кеш-пам'ять , ресурс буде змінено.
Детальніші відомості про кешування IE9 можна побачити в цій публікації блогу кешування msdn .
У моїх останніх тестах з 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
випадковим чином залежно від ресурсу.
private,max-age=0
.
макс-вік Коли проміжний кеш змушений за допомогою директиви max-age = 0 повторно підтверджувати власний запис у кеш, і клієнт надав власний валідатор у запиті наданий валідатор може відрізнятися від валідатора, який зараз зберігається з записом кешу. У цьому випадку кеш МОЖЕ використовувати будь-який валідатор, щоб зробити власний запит без що впливає на семантичну прозорість. Однак вибір валідатора може вплинути на продуктивність. Найкращий підхід - це проміжний кеш, щоб використовувати власний валідатор при поданні свого запиту. Якщо сервер відповідає з 304 (Не модифіковано), то кеш може повернути клієнтові свою вже перевірену копію з 200 (ОК) відповіддю. Якщо сервер відповідає з новим об'єктом і валідатором кешу, однак проміжний кеш може порівнювати повернутий валідатор з наданим у запит клієнта, використовуючи функцію сильного порівняння. Якщо валідатор клієнта є дорівнює початковому серверу, тоді проміжний кеш просто повертає 304 (Ні Змінено). В іншому випадку він повертає нову суть із відповіддю 200 (ОК). Якщо запит включає директиву no-cache, він НЕ повинен включати min-fresh, макс-несвіжий або макс-вік.
люб’язно: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.4
Не сприймайте це як відповідь - мені доведеться його прочитати, щоб зрозуміти справжнє його використання :)
Я навряд чи є експертом з кешування, але Марк Ноттінгем є. Ось його документи з кешування . Він також має чудові посилання в розділі "Посилання".
Виходячи з того, що я читаю ці документи, схоже, що це max-age=0
може дозволити кешу надіслати кешовану відповідь на запити, що надходили в "той самий час", коли "той самий час" означає досить близько один до одного, вони виглядають одночасно з кешем, але no-cache
не .
До речі, варто відзначити, що деякі мобільні пристрої, зокрема продукти 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.
Це була хороша нитка з великою кількістю хорошої технічної інформації, але також важливо відзначити, наскільки погана підтримка цього матеріалу в особливо мобільних пристроях. Кожні кілька місяців мені доводиться додавати більше шарів захисту від їх неспроможності виконувати команди заголовків, які вони отримують, або правильно переривати ці команди.
Одне, що (на диво) не було згадано - це те, що запит може явно вказувати на те, що він буде приймати застарілі дані, використовуючи max-stale
директиву. У такому випадку, якщо сервер відповів max-age=0
, кеш буде просто вважати відповідь несвіжою і був би вільний використовувати його для задоволення запиту клієнта [який вимагав потенційно несвіжих даних]. На противагу цьому, якщо сервер надсилає, no-cache
що дійсно козирує будь-який запит клієнта (з max-stale
) щодо несвіжих даних, оскільки кеш ОБОВ'ЯЗКОВО скасувати.
Різниця полягає в тому, що no-cache (no-store на Firefox) запобігає будь-який тип кешування. Це може бути корисно для запобігання запису сторінок із захищеним вмістом на диск та для сторінок, які завжди повинні оновлюватися, навіть якщо їх повторно відвідують за допомогою кнопки "назад".
max-age = 0 вказує на те, що запис кешу необов’язковий і вимагає повторної перевірки, але не запобігає кешування. Часто браузери перевіряють ресурси лише один раз за сеанс роботи веб-переглядача, тому вміст може не оновлюватися, поки сайт не буде відвідано в новому сеансі.
Зазвичай веб-переглядачі не видалятимуть записи кеш-пам’яті, що втратили чинність, якщо тільки вони не отримають місця для нового вмісту, коли кеш браузера заповнений. Використовуючи no-store, no-cache дозволяє чітко видалити запис із кешу.
max-age=0
якщо ви маєте на увазі, що кешування дозволено, але ресурс повинен бути повторно підтверджений і no-store
якщо ви взагалі не хочете, щоб відповідь зберігалася в кеші. no-cache
Випадковим чином позначені для позначення будь-якої з них в залежності від призначеного для користувача агента постачальника і номер версії і протоколу передачі.