Що таке кеш-контроль: приватний?


148

Коли я відвідую chesseng.herokuapp.com, я отримую заголовок відповіді, який виглядає так

Cache-Control:private
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/css
Date:Tue, 16 Oct 2012 06:37:53 GMT
Last-Modified:Tue, 16 Oct 2012 03:13:38 GMT
Status:200 OK
transfer-encoding:chunked
Vary:Accept-Encoding
X-Rack-Cache:miss

а потім я оновлю сторінку і отримую

Cache-Control:private
Connection:keep-alive
Date:Tue, 16 Oct 2012 06:20:49 GMT
Status:304 Not Modified
X-Rack-Cache:miss

тому здається, що кешування працює. Якщо це працює для кешування, то в чому сенс Expires and Cache-Control: max-age . Щоб додати плутанину, коли я перевіряю сторінку на веб- сторінці https://developers.google.com/speed/pagespeed/insights/, вона підказує мені "Використовувати кешування браузера".


перевірити цю діаграму stackoverflow.com/a/49925190/3748498
pravdomil

Відповіді:


74

Щоб відповісти на запитання про те, чому кешування працює, навіть якщо веб-сервер не містить заголовків:

  • Термін дії: [a date]
  • Кеш-контроль: max-age =[seconds]

Сервер люб'язно попросив будь-яких проміжних проксі-серверів не кешувати вміст (тобто елемент повинен кешуватися лише в приватному кеші, тобто лише на вашій локальній машині):

  • Кеш-контроль: приватний

Але сервер забув включити будь-які підказки кешування:

  • вони забули включити Expires , тому браузер знає, як використовувати кешовану копію до цієї дати
  • вони забули включити Max-Age , тому браузер знає, наскільки довго кешований елемент хороший
  • вони забули включити E-Tag , тому браузер може зробити умовний запит

Але вони включили у відповідь дату останньої зміни :

Last-Modified: Tue, 16 Oct 2012 03:13:38 GMT

Оскільки браузер знає дату зміни файлу, він може виконати умовний запит . Він попросить сервер для файлу, але доручить серверу надсилати файл лише у тому випадку, якщо він був змінений з 2012/10/16 3:13:38:

GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT

Сервер отримує запит, розуміє, що у клієнта вже є остання версія. Замість того, щоб надсилати клієнта з 200 OKподальшим вмістом сторінки, натомість це говорить про те, що кешована версія хороша:

304 Not Modified

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

Чому Макс-Вік ? Чому термін дії закінчується ?

Тому що Last-Modified смокче.

Не всі на сервері має дату , пов'язану з ним. Якщо я будую сторінку на ходу, з нею не пов’язана дата - це зараз . Але я абсолютно готовий дозволити користувачу кешувати домашню сторінку на 15 секунд:

200 OK
Cache-Control: max-age=15

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

Чеснота додавання Cache-Control: max-ageполягає в тому, що браузер навіть не повинен виконувати умовний запит.

  • якщо ви вказали лише Last-Modified, браузер повинен виконати запит If-Modified-Sinceі стежити за 304 Not Modifiedвідповіддю
  • якщо ви вказали max-age, веб-переглядачу навіть не доведеться страждати від обходу мережі; вміст вийде прямо з кеш-пам'яті

Різниця між "Кеш-контролем: максимальний вік" та "Закінчується"

Expiresє застарілим еквівалентом сучасного (c. 1998) Cache-Control: max-ageзаголовка:

  • Expires: Ви вказуєте дату (yuck)
  • max-age: Ви вказуєте секунди (добро)
  • І якщо вказано обидва , тоді браузер використовує max-age:

    200 OK
    Cache-Control: max-age=60
    Expires: 20180403T192837 
    

Будь-який веб-сайт, написаний після 1998 року, Expiresбільше не повинен використовувати , а замість цього використовувати max-age.

Що таке ETag?

ETag схожий на Last-Modified , за винятком того, що він не повинен бути датою - він просто повинен бути чимось .

Якщо я витягаю список продуктів із бази даних, сервер може надсилати останні rowversionяк ETag, а не як дата:

200 OK
ETag: "247986"

Моїм ETag може бути хеш SHA1 статичного ресурсу (наприклад, зображення, js, css, шрифту) або кешованої відображеної сторінки (тобто це робить вікі Mozilla MDN; вони мають хеш-кінцеву розмітку):

200 OK
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"

І точно так само, як і у випадку із умовним запитом на основі Last-Modified :

GET / HTTP/1.1
If-Modified-Since: Tue, 16 Oct 2012 03:13:38 GMT

304 Not Modified

Я можу виконати умовний запит на основі ETag:

GET / HTTP/1.1
If-None-Match: "33a64df551425fcc55e4d42a148795d9f25f89d4"

304 Not Modified

ETagПеревершує , Last-Modifiedтому що він працює для речей , крім файлів , або речей , які мають уявлення про дату . Це як раз є


1
Дивовижно! Я поставив щедроту за цю відповідь. Що станеться, якщо cache-controlйого немає? А у вас є лише Етаг? Чи все ще не потрібно робити "умовний запит" проти сервера? Поведінка, яку я бачу, коли я в офлайні, - це те, що вона просто повертається з кешу. Але коли він перебуває в офлайні, він не може зробити цей умовний запит. Так це означає, якщо він буде кешований нескінченно, якщо ви залишаєтесь поза межами мережі? Я вже тут детально задав це питання . Ви можете поглянути?
Мед

167
Cache-Control: private

Вказує, що все або частина відповіді на повідомлення призначене для одного користувача і НЕ МОЖЕ бути кешоване загальним кешем, таким як проксі-сервер.

З розділу RFC2616 14.9.1


14
Тому що це було кешоване вашим браузером. Ви єдиний користувач, для якого відповідь була призначена.
Дан Д.

13
Ні, це не тому, що Cache-Control:privateлише заяви, що спільні кеші (наприклад, кеші проксі), не повинні кешувати відповідь.
Ден Д.

5
@Trejkaz Ні, це дійсно означає одного користувача. Користувач - це обліковий запис, який має власний домашній каталог, у якому знаходиться кеш-пам'ять. Ті профілі, які належать одному користувачеві, можуть спільно використовувати кеш. Як ви знайшли. Але два профілі на одному комп’ютері, якщо вони належать різним користувачам, не повинні спільно використовувати кеш, за винятком випадків, коли кеш не розглядається як спільний кеш.
Ден Д.

2
Так, це на рівні користувача на рівні ОС. Так, мені цікаво, що через очевидний протікання інформації між анонімними вікнами Chrome і неінкогніто, які використовують кеш для цього.
Трежказ

2
@didibus proxy-revalidateвимагає, щоб проксі-сервери завжди переглядалися під час кожного доступу. Де як privateзапобігає кешування проксі-сервера.
Ден Д.

20

RFC 2616, розділ 14.9.1 :

Вказує на те, що все або частина відповіді на повідомлення призначене для одного користувача і НЕ МОЖЕ бути кешоване загальним кешем ... Приватний (неподілений) кеш МОЖЕ кешувати відповідь.


Браузери можуть використовувати цю інформацію. Звичайно, поточний "користувач" може означати багато речей: користувача ОС, користувача браузера (наприклад, профілі Chrome) тощо. Це не вказано.

Для мене більш конкретний приклад з Cache-Control: privateє те , що проксі - сервери (які , як правило , мають багато користувачів) НЕ кешувати. Він призначений для кінцевого споживача, і ні для кого іншого.


За фахом, RFC чітко пояснює, що це не забезпечує безпеку. Йдеться про показ правильного вмісту, а не про безпеку контенту.

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


5
Приватний кеш (не загальний) кеш МОЖЕ кешувати відповідь. Ця частина є ключовою. Дякую.
Олівер

0

У полі заголовка сутності Expires вказується дата / час, після яких відповідь вважається несвіжою. Поле кеш-керування: поле maxage дає вікове значення (у секундах) більше, ніж відповідь вважається несвіжим.

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

Щоб вирішити цю проблему, HTTP1.1 видає голову останнього модифікації. Сервер дає останню змінену дату відповіді клієнту. Коли клієнту потрібен цей ресурс, він надсилатиме на сервер поле Head-Modified-Since. Якщо ця дата передує зміненій даті повторного доступу, сервер відправить клієнту ресурс і видасть 200 кодів. Інакше він поверне клієнту 304 код, а це означає, що клієнт може використовувати кешований ресурс.

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