Почему Chrome не кэширует ответы, даже если присутствует заголовок управления кешем?

Я пытаюсь понять, КОГДА Chrome кеширует вещи и как он решает, что кеширует. Например, я посетил эту новостную статью и открыл DevTools. https://www.nextgov.com/ideas/2020/07/so-much-decentralized-internet/167281/

Я удостоверился, что кэш включен (т. Е. Отключен кеш не отмечен).

Когда я обновляю страницу, снова выполняется вызов 167281/. Он не извлекается из кеша. Это несмотря на то, что в ответе установлен заголовок cache-control.

Почему Chrome не кэширует этот (и многие другие ресурсы) на странице?

Кэш Chrome

Cache DevTools


person CodyBugstein    schedule 29.07.2020    source источник
comment
У меня аналогичная проблема, когда PageSpeed ​​Insights показывает мне ресурсы в статических активах Audit Serve с эффективной политикой кеширования, даже если для тега управления кешем установлено значение один год.   -  person Miguel Mateo    schedule 01.08.2020
comment
@MiguelMateo, возможно, вы устанавливаете тег управления кешем для html-страницы на один год, но не для статических ресурсов (изображений, файлов css, .js libs)   -  person Daniel Mitre    schedule 09.08.2020


Ответы (2)


Когда вы устанавливаете cache-control: max-age=..., вы говорите запрашивающей стороне, что можно безопасно кэшировать ресурс в течение такого длительного времени.

Но каждый браузер (или приложение в целом) должен решать, когда на самом деле кэшировать. Мобильные браузеры могут кэшировать только небольшие ресурсы, а браузеры настольных компьютеров могут делать наоборот.

Учитывая ваш пример в Firefox Developer Edition 80.0b5 после некоторых перезагрузок страница начала кешировать, изменив параметр cache-control на if-modified-since. Это означает, что в браузере есть кэшированный ресурс, но он будет запрашивать у сервера ресурс, просто чтобы проверить, обновлен ли он. Если это так, сервер (или какой-либо промежуточный сетевой маршрутизатор) просто вернет ответ 304 без фактического содержимого, что в точности соответствует тому, что вы показали:

введите описание изображения здесь  введите описание изображения здесь

Но когда я нажимаю ввод в строке URL или когда я использую кнопки навигации, кеш используется без какого-либо фактического запроса:

введите описание изображения здесь

Важно добавить, что элемент управления кешем - это подсказка, но не фактическому инициатору запроса: посредники также будут использовать эту информацию для кэширования ответов и ускорения загрузки следующих запросов. И даже если основной ресурс (html-страница) кэшируется, все ресурсы, связанные со страницей, имеют свой собственный тег cache-control.

Перенесенный столбец в dev-tools, кажется, лучше показывает, был ли ресурс эффективно кэширован локально или нет:

введите описание изображения здесь

person Daniel Mitre    schedule 08.08.2020
comment
Итак, в моем случае, почему он делает новый запрос, если он получает 304? - person CodyBugstein; 09.08.2020
comment
После результата 304 (с пустым телом) вы не делаете новых запросов для этого ресурса. Но тот же процесс происходит со всеми связанными ресурсами (изображениями, css, js-библиотеками) или динамически запрашиваемыми (пинги, сбор данных) со страницы. - person Daniel Mitre; 09.08.2020
comment
Спасибо! Можете ли вы пояснить это в своем ответе? Я не понял, что на этот вызов фактически не попадает контент в ответ - person CodyBugstein; 09.08.2020

Сервер возвращает код состояния HTTP 304, что означает, что браузер сообщает, что его кеш все еще действителен и что он должен его использовать.

Цитата из https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching: при запросе проверки сервер может либо игнорировать запрос проверки и ответ с нормальным 200 OK, либо он может вернуть 304 Not Modified (с пустым телом), чтобы проинструктировать браузер, чтобы использовать его кэшированную копию. Последний ответ также может включать заголовки, обновляющие срок действия кэшированного документа.

person Don Ha    schedule 07.08.2020
comment
Тогда почему браузер не прислушивается к этой инструкции и не использует кешированную версию? - person CodyBugstein; 09.08.2020
comment
... Если вы нажмете кнопку обновления / перезагрузки или нажмете горячую клавишу F5 в своем веб-браузере, это вызовет «мягкое обновление» в веб-браузере, где он проверит веб-сервер, чтобы увидеть, были ли файлы изменены. В случае изменения веб-браузер загрузит последнюю версию файла, а если не будет изменен, веб-браузер продолжит использовать версию кеша. Мягкое обновление требует очень небольшой полосы пропускания только для проверки заголовков HTTP-ответов файлов, чтобы определить, были ли файлы изменены. Подробнее: raymond. cc / blog / - person Don Ha; 10.08.2020