Какую эвристику используют браузеры для кэширования ресурсов, явно не предназначенных для кэширования?
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. Источник.
Рекомендации
-
Используйте только заголовки HTTP для управления кешированием браузера. Если вы решите пойти против этого, имейте в виду, что IE распознает только две директивы управления кешем, которые установлены внутри HTML:
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="-1">
и, по-видимому, только первый используется в сценарии HTTPS. Кроме того, при попытке использовать Pragma
в IE может возникнуть проблема . Наконец, Chrome игнорирует директивы кэша в метатегах, что еще больше снижает их полезность.
-
Не используйте заголовок Expires
. В современных браузерах Expires
заменяется на Cache-Control
. Expires: 0
и Pragma: no-cache
являются технически недопустимыми заголовками ответов. Да, они существовали с самого начала, но не все современные браузеры (например, Chrome) использовали их, и они были заменены на Cache-Control
.
-
Заголовок Vary
- это минное поле. Как Vary
ведет себя в старых IE. Как Vary
ведет себя с XHR. Обнаружение деталей остается как упражнение для читателя - и оставляет впечатление, что предпочтительнее использовать разные URL-адреса для различного контента...
-
Разрешить браузеру выполнять условные запросы, установив ETags
.
Etags позволяют браузеру выполнять легкую проверку, чтобы увидеть, изменилось ли содержимое, и может избежать полного запроса, если это не так.
-
Помните, что некоторые браузеры просто сломаны и нужны хаки. В IE 8 могут возникать проблемы с загрузкой файлов, которые, как было сказано, не кэшированы.
Алгоритмы кэширования браузера
См. также
Ответ 5
Вычисление Gecko заканчивается на now + (now - lastModified)/10
, последний раз я проверил.