Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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, последний раз я проверил.