Какую эвристику используют браузеры для кэширования ресурсов, явно не предназначенных для кэширования?

13.2.2 Эвристическое истечение

Поскольку исходные серверы не всегда предоставляют явное время истечения срока действия, HTTP-кэши обычно назначают эвристические периоды истечения срока действия, используя алгоритмы, которые используют другие значения заголовка (например, Last-Modified time) для оценки правдоподобного времени истечения. Спецификация HTTP/1.1 не предоставляет конкретных алгоритмов, но налагает наихудшие ограничения на их результаты. Поскольку эвристическое время истечения срока может скомпрометировать семантическую прозрачность, они должны использоваться осторожно, и мы рекомендуем серверам происхождения предоставлять явное время истечения как можно больше. HTTP/1.1 RFC 2616

Каковы алгоритмы, используемые браузерами для оценки вероятных сроков истечения срока действия?

Идеальный ответ будет охватывать все основные браузеры с доказательствами из исходного кода или официальных сообщений в блогах.

Ответ 1

В этом сообщении в блоге говорится, что Internet Explorer 9 использует max-age = (DownloadTime - LastModified) * 0.1: http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx

Что фактически совпадает с Mozilla (этот пост довольно старый, я не знаю, изменился ли он с тех пор): https://developer.mozilla.org/en-US/docs/HTTP_Caching_FAQ

Ответ 2

Из исходного кода Chromium: https://code.google.com/p/chromium/codesearch#chromium/src/net/http/http_response_headers.cc&l=1082&rcl=1421094684

  if ((response_code_ == 200 || response_code_ == 203 ||
       response_code_ == 206) && !must_revalidate) {
    // TODO(darin): Implement a smarter heuristic.
    Time last_modified_value;
    if (GetLastModifiedValue(&last_modified_value)) {
      // The last-modified value can be a date in the future!
      if (last_modified_value <= date_value) {
        lifetimes.freshness = (date_value - last_modified_value) / 10;
        return lifetimes;
      }
    }
  }

Ответ 3

Похоже, webkit ( "... системная версия OS X для движка, используемая Safari..." ) использует те же эвристики, что и хром.

Из CacheValidation.cpp взято следующее:

return (creationTime - lastModifiedValue) * 0.1;

Ответ 4

Предположим, что все браузеры, которые нас интересуют, - Internet Explorer 8 или новее (например, IE5 имеет ужасное поведение с заголовками кеширования).

Существует только ОДИН стандарт, основанный на управлении кешированием (представленный с помощью HTTP/1.1) - Cache-Control HTTP-заголовок.

Так как по крайней мере 1996 IE использует политику отказа для кэширования содержимого HTTPS.

По-видимому, с момента его появления Chrome отказался от HTTPS (т.е. он будет кэшировать его, если не будет сказано). В 2011 году Firefox 4 (но не Safari) переключился на отказоустойчивое кэширование контента HTTPS. Источник.

Рекомендации

Алгоритмы кэширования браузера

См. также

Ответ 5

Вычисление Gecko заканчивается на now + (now - lastModified)/10, последний раз я проверил.