Что происходит при повторном запросе кэшированного ресурса
Что проверяют
Понимаете ли вы, что «взялось из кэша» это несколько разных состояний, и умеете ли читать вкладку сети. Вопрос быстро отделяет тех, кто настраивал раздачу статики, от тех, кто лечит любые странности жёсткой перезагрузкой.
Как отвечать
Опишите развилку. Браузер находит ресурс в кэше и смотрит, свежий ли он, по Cache-Control: max-age или по устаревшему Expires, который проигрывает, когда заданы оба:
- ресурс свежий: сети нет вообще, ответ берётся из памяти или с диска, во вкладке сети это видно как
from memory cacheилиfrom disk cache; - ресурс протух: уходит условный запрос с
If-None-MatchизETagиIf-Modified-SinceизLast-Modified. Сервер отвечает304без тела, браузер продлевает свежесть и отдаёт прежнюю копию, либо присылает200с новым телом; no-storeзапрещает хранить вовсе,no-cacheразрешает хранить, но требует проверки перед каждым использованием.
Добавьте практику: файлы с хешем в имени раздают с длинным max-age и immutable, документ отдают с no-cache, чтобы новая сборка подхватывалась сразу. Упомяните Vary, из-за которого ответы различаются по заголовку запроса, и Service Worker: он перехватывает запрос раньше, чем в дело вступит кэш протокола.
Где спотыкаются
Считают, что no-cache означает «не кэшировать». Он означает «хранить, но каждый раз спрашивать сервер». Запрет это no-store, и путаница стоит либо лишних запросов, либо приватного ответа, осевшего на общем диске.
Второе: борются с устареванием версией в параметре запроса. Часть посредников такие адреса не различает или не кэширует вовсе, а хеш в имени файла работает всегда: новый адрес нельзя спутать со старым, и старую копию не нужно протухать принудительно.
Третье: проверяют кэш перезагрузкой страницы с открытыми инструментами разработчика. Там нередко включено отключение кэша, да и сама перезагрузка добавляет условные запросы, которых у обычного пользователя не будет. Смотреть надо повторный переход по ссылке.