Hashed-ассеты остаются, HTML-оболочка нет
JS и CSS с хешем содержимого получают долгий max-age. Документ, который на них указывает, ревалидируется после каждого деплоя.
Имя с хешем это контракт. app.abc12.js не изменится. nginx может отдать большой max-age и флаг immutable. HTML-оболочка не может. После деплоя это единственный документ, который указывает на новые хеши. Закэшированная оболочка со ссылками на удалённые файлы это пустая страница у вернувшихся посетителей.
Шрифты и картинки теперь с теми же долгими заголовками. gzip только для текстовых типов. Сжимать webp или woff2 значит жечь CPU без выигрыша.
Обход по cookie
Анонимный GET HTML ещё идёт через короткий microcache nginx. Ключ это scheme, host, uri и локаль. Query-строки, которые не меняют страницу, в ключ не входят. Запросы с auth_token этот кэш обходят. Вошедший пользователь не должен получить публичный фрагмент.
JSON под /api остаётся у PHP. Кэш API в nginx смешивал список одной локали с записью из другой вкладки.
Проверка после сборки
Открыть страницу. Убедиться, что оболочка ревалидируется. Убедиться, что JS и CSS приходят с большим max-age. Нет манифеста Vite хуже, чем 500. Страница рендерится без CSS и выглядит сломанной, а не падает.
Правило короткое. Hashed-файлы неизменяемы. HTML-оболочка нет. Cookie обходит общий HTML-кэш. Это обновление nginx на этом сайте.
