Чому ця відповідь кешується?


32

У мене є клієнт, чий сайт index.html наразі повертається з такими заголовками:

Accept-Ranges: байти
Підключення: Keep-Alive
Кодування вмісту: gzip
Довжина вмісту: 3658
Тип вмісту: текст / html
Дата: Чт, 10 жовтня 2013 07:36:27 GMT
ETag: "4aa95e1-2ed2-4e721324728b7"
Тримайте живу: тайм-аут = 5, макс = 100
Останнє змінення: вт, 24 вересня 2013 13:34:30 GMT
Сервер: Apache / 2.2.22
Варіант: Accept-Encoding, User-Agent

Очевидно , я буду рекомендувати , що вони додають Expiresабо Cache-Controlв залежності від обставин, але я збентежений: Хром кешируєт цей ресурс і використовує його з кешу (не посилає запит на все ), навіть після кількох годин (наприклад, він повторно копії він кеширувався вчора о 13:30 сьогодні вранці о 8:30 ранку). Я бачу це досить чітко на вкладці "Мережа" консолі Chrome, де він відображає запит і має 200 (OK)сірий колір у стовпці " Стан " та (from cache)в стовпці " Розмір ". (Я не змінив налаштування кешування Chrome у керуванні.)

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

Відповіді:


33

Коли «Expires» і «заголовки Cache-Control» не визначені, але «Last-Modified» заголовок буде вказано, браузери повинні вгадати, як довго вони повинні зберегти документ в кеші. Деякі браузери роблять алгоритми , які дозволяють використовувати сторінку залишатися в кеші в протягом дня або більше.

Посібник з передового досвіду кешування Google зазначає:

Last-Modified - це "слабкий" заголовок кешування, оскільки браузер застосовує евристику, щоб визначити, вибирати елемент із кешу чи ні. (Евристика відрізняється між різними браузерами.)


У Mozilla (Firefox) є запитання про керування HTTP, що описує їх алгоритм для даної ситуації (хоча можливо, що алгоритм змінився з моменту датування документа 2002 р.):

... ми шукаємо заголовок "Останнє змінення". Якщо цей заголовок присутній, то термін свіжості кеш-пам'яті дорівнює значенню заголовка "Дата" за вирахуванням значення заголовка "Остання зміна", поділеному на 10.

Тож у вашому випадку, коли різниця між модифікованим і тепер становить 15 днів, Firefox буде кешувати ресурс протягом 1,5 днів.

Схоже, всі основні браузери використовують те саме правило 10%, яке застосовує Firefox. На StackOveflow поставлено запитання із запитом цих евристик . Різні відповіді для різних браузерів показують, що всі вони мають подібні варіанти реалізації. Є відповіді для Internet Explorer і Webkit (Chrome і Safari).


Розмір кешу браузера, ймовірно, буде обмежуючим фактором для файлу, який алгоритм кешування визначає, може зберігатися більше доби. Як правило, у браузерах встановлено кількість дискового простору, яке вони використовують для кешу. Багато користувачів також очищають кеш-пам'ять, коли закривають веб-переглядач. Отже, кількість часу, за який кешується такий файл, зазвичай залежить від:

  • Кількість простору кешу, який браузер виділив
  • Кількість веб-сайтів, які відвідує користувач (і розмір цих сайтів)
  • Незалежно від того, користувач закрив свій браузер чи ні

Чи можете ви уточнити, "тоді Firefox кешуватиме ресурс протягом 1,5 днів." З якої дати воно збережеться до 1,5 дня? Якщо це вже 15 днів, то це вже минуло б, чи не так? А оскільки ЗАРАЗ-мінус остання зміна назавжди зростатиме, ви маєте на увазі, вона буде кешована назавжди!
myDoggyWritesCode

1
Не назавжди. За 1/10 часу між останнім зміненим заголовком і часом завантаження. Якщо для вас минуло 15 днів, це може означати, що минуло 150 днів з моменту останнього зміни файлу.
Стівен Остерміллер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.