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

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

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

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

    Initial Download

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

    First pull

  3. Зайдите на страницу еще раз и проверьте трассировку сети. Теперь SuperFish.css извлекается из кэша.

    Cached image

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

Ответы [ 2 ]

4 голосов
/ 05 января 2012

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

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

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

13.2.2 Эвристическое истечение срока действия

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

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

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

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

0 голосов
/ 05 января 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...