Почему / как браузеры знают, что нужно кэшировать контент (html,css,js и т. Д.), Если явно не указано иное

Я искал в Chirpy минимизацию css/js, сжатие и т. Д. Я заметил, что он не поддерживает кэширование. Он не имеет никакой логики для отправки истекающих заголовков, etags и т. Д.

Отсутствие этой функции заставило меня усомниться в том, что кеширование контента не так важно; YSlow! оценки это так, я немного запутался. Сейчас я изучаю кеширование и не могу объяснить, почему этот файл CSS, SuperFish.css, извлекается из кеша.

  1. Посетите http://www.weirdlover.com/ (разработчик Chirpy)

    Начальная загрузка

  2. Посмотрите на начальную сетевую дорожку. Обратите внимание, что для истечения срока действия заголовка SuperFish.css,

    Первое нажатие

  3. Зайдите на страницу и снова просмотрите трассировку сети. Сейчас SuperFish.css извлекается из кеша

    Кэшированное изображение

Почему SuperFish.css извлекается из кэша при повторном посещении страницы? Это происходит, даже когда я закрываю все экземпляры Chrome и затем снова захожу на страницу.

2 ответа

Решение

Это похоже на спецификацию HTTP.

13.4 Кэшируемость ответов

Если это не ограничено директивой управления кэшем (раздел 14.9), система кэширования МОЖЕТ всегда хранить успешный ответ (см. Раздел 13.8) в качестве записи кэша, МОЖЕТ вернуть его без проверки, если он свежий

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

Поскольку исходные серверы не всегда предоставляют явное время истечения, HTTP-кэши обычно назначают эвристическое время истечения, используя алгоритмы, которые используют другие значения заголовка (например, время последнего изменения) для оценки вероятного времени истечения.

Казалось бы, если не предоставить заголовок управления кэшем, и, исключив заголовок expires, клиент может свободно использовать эвристику для генерации даты истечения срока действия, а затем кэшировать ответ, основанный на этом.

Присутствие etag не влияет на это, так как etag используется для повторной проверки записи кэша с истекшим сроком, и в этом случае chrome считает, что кэшированная запись является новой (то же самое относится и к последним модифицированным), таким образом, он не ' Т еще не истек.

Общий принцип заключается в том, что если исходный сервер озабочен свежестью, он должен явно указать это.

В этом случае (когда сервер не возвращает заголовок Expires), браузер должен сделать HTTP-запрос с заголовком If-Modified-Since, а если сервер возвращает HTTP 304 Не изменен, то браузер получает данные из кэша. Но, я вижу, в настоящее время браузеры не делают никаких запросов, когда данные находятся в кеше. Я думаю, что они ведут себя таким образом для лучшего времени отклика.

Другие вопросы по тегам