З 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
тому, що відповідь буде вважатися негайно несвіжою.
- Тож я нарешті позначу відповідь Гілі!