1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6

# конспект · шаг 6 из 6

Конспект: кеш браузера

выжимка - её можно унести в заметки

Кеш браузера: три исхода вместо двух и правила, по которым выбирают заголовки.

Три исхода

Исход Что происходит Стоимость
свежий в кеше запроса нет вообще 0 мс, 0 байт
устарел, есть валидатор условный запрос → 304 round-trip, ~200 байт
нет в кеше или запрещено обычный запрос → 200 с телом round-trip + вес файла

Что чем задают

expires 30d;                                   # Cache-Control: max-age=2592000 + Expires
add_header Cache-Control "public, max-age=31536000, immutable";
add_header Cache-Control "no-cache";           # оболочка SPA: хранить, но перепроверять
Тип файла Стратегия
ассеты с хешем в имени (app.4f2c1b.js) max-age=31536000, immutable
оболочка SPA (index.html) no-cache - хранить, но перепроверять; иначе пользователи останутся на старой версии
картинки без версии в имени недолгий max-age + валидатор

Валидаторы

ответ:   Last-Modified: …    ETag: "68b3f2ae-1f4c"
запрос:  If-Modified-Since: …  If-None-Match: "68b3f2ae-1f4c"
ответ:   304 Not Modified (тела нет)

Куски файла

Заголовок Кто ставит Смысл
Accept-Ranges: bytes nginx сам, на любой файл с диска «куски отдавать умею»
Range: bytes=1000-1999 клиент «дай кусок»
Content-Range: bytes 1000-1999/50000 nginx границы куска и полный размер

Код успеха - 206, выход за границу файла - 416. Несколько кусков за раз дают тело multipart/byteranges.

Сжатие отменяет куски целиком: при Content-Encoding: gzip ответ идёт только полностью, и Accept-Ranges исчезает. Для текста выбирают сжатие, для архивов и видео - куски. Проксируемый ответ режет не nginx, а приложение.

Ловушки джокера

  • no-cache - это не «не кешировать». Он разрешает хранить копию и требует проверять её перед показом (часто это быстрый 304). Полный запрет - no-store.
  • Пересборка ломает кеш, даже если содержимое не изменилось: у файла новое время, значит новый ETag и Last-Modified.
  • При сжатии ETag становится слабым. Тот же файл отдаётся как ETag: "6a995c99-a90" без сжатия и W/"6a995c99-a90" с gzip.
  • На двух серверах ETag разные - файлы разложены в разное время, и клиент за балансировщиком получает 200 вместо 304. Лечится синхронизацией времени файлов или отключением etag.
  • expires и add_header без always не работают на небезопасных кодах - на 404 и 500 заголовки не появятся.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.