# конспект · шаг 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 заголовки не появятся.
Комментарии
Пока нет комментариев. Будь первым!
Оставить комментарий