Почему этот ответ кэшируется?

32

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

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

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

Я понимаю, что спецификация позволяет пользовательским агентам принимать собственные решения в отсутствие указаний заголовков. Это то, что здесь происходит? Chrome видит, что он был последний раз изменен несколько дней назад, и может свободно использовать версию, которая, скажем, устарела? Или мне чего-то не хватает?

TJ Crowder
источник

Ответы:

33

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

Руководство по передовой практике кэширования Google гласит:

Last-Modified - это «слабый» заголовок кэширования, в котором браузер применяет эвристику, чтобы определить, извлечь элемент из кэша или нет. (Эвристика различна для разных браузеров.)


У Mozilla (Firefox) есть FAQ по кэшированию HTTP, в котором излагается их алгоритм для этой ситуации (хотя возможно, что алгоритм изменился с момента выпуска документа 2002 года):

... мы ищем заголовок "Last-Modified". Если этот заголовок присутствует, то время существования свежести кэша равно значению заголовка «Дата» минус значение заголовка «Последние изменения», деленное на 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 дней с момента последнего изменения файла.
Стивен Остермиллер