Как можно управлять кешированием на стороне клиента (браузера)

Ответ

Управление кешированием в браузере осуществляется с помощью HTTP-заголовков ответа сервера и специальных техник в URL ресурса. Основная цель — заставить браузер загрузить свежую версию файла, когда это необходимо.

1. HTTP-заголовки

Это основной способ управления кешем. Сервер отправляет их вместе с ресурсом.

  • Cache-Control: Главный заголовок для управления кешированием.
    • no-store: Полностью запрещает кеширование. Запрос всегда идет на сервер.
    • no-cache: Браузер должен сначала проверить у сервера, не изменился ли ресурс (сделать запрос с If-None-Match или If-Modified-Since), и только потом использовать кеш.
    • max-age=<seconds>: Указывает, сколько секунд браузер может использовать кешированную версию без проверки.

Пример заголовка для отключения кеша:

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

2. "Cache Busting" (Сброс кеша)

Эта техника заключается в изменении URL ресурса, чтобы браузер воспринял его как новый и загрузил заново. Обычно это достигается добавлением query-параметра.

Почему это работает: Для браузера style.css?v=1 и style.css?v=2 — это два разных URL, даже если они указывают на один и тот же файл.

Примеры реализации:

  • Версионирование: Добавление версии сборки.
    <link rel="stylesheet" href="/css/style.css?v=1.0.2">
  • Временная метка: Добавление timestamp'а сборки.
    <script src="/js/main.js?t=1678886400"></script>
  • Хеш файла: Наиболее надежный способ. URL меняется только тогда, когда меняется содержимое файла.
    <link rel="stylesheet" href="/css/style.a1b2c3d4.css">

    Современные сборщики (Webpack, Vite) делают это автоматически.

3. Пользовательские действия

  • Жесткая перезагрузка (Hard Refresh): Ctrl+Shift+R (Windows/Linux) или Cmd+Shift+R (Mac) заставляет браузер проигнорировать кеш для текущей страницы.

Ответ 18+ 🔞

Да ты посмотри, какая хуйня творится с этим кешем в браузере! Сидит себе пользователь, довольный, как слон, а у него там старый скрипт закеширован, который ещё при царе Горохе писали. И всё, приехали — баги прут, как сумасшедшие. А всё потому, что не умеют эти распиздяи, прости господи, заголовки правильные выставлять.

Слушай сюда, сейчас разжую, как бабушка кашу. Управляется эта хрень в основном через HTTP-заголовки. Сервер, такой важный, отправляет их вместе с файлом, а браузер, тупой как пробка, читает и делает, что велят.

Вот главный заголовок — Cache-Control. Это царь и бог. Хочешь, чтобы файл вообще не кешировался? Шли ему no-store. Браузер будет каждый раз ползать на сервер, как последний лох, и качать заново. Хочешь, чтобы он хотя бы спросил «а можно ли старый взять?» — вот тебе no-cache. Он пошлёт запрос с чем-то типа If-None-Match, сервер скажет «304 Not Modified» — и только тогда браузер достанет файл из своего загашника. А max-age=3600 — это типа «сиди, не дергайся, час можешь эту версию использовать».

Вот, смотри, как нахуй совсем отключить кеш, чтоб даже не думал:

Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0

Три заголовка — и браузеру пиздец, волю не дают ни на йоту.

Но это, блядь, не всегда помогает! Особенно с этими долбоёбами-прокси и CDN, которые живут своей жизнью. Поэтому есть народная мудрость — «Cache Busting», или по-нашему — «сброс кеша через ебальник».

Суть проще пареной репы: меняем URL файла, и браузер думает, что это новый ресурс. Он же тупой, для него script.js?v=1 и script.js?v=2 — это две большие разницы, даже если файл один и тот же, просто переименовали!

Как это делают умные люди:

  • Версию прикручивают: Типа style.css?v=1.0.2. Выпустили новую версию — поменяли цифру. Проще некуда.
  • Таймстамп лепят: main.js?t=1678886400. Время сборки подставили — и всё, URL новый.
  • Хеш файла в название вставляют: Вот это уже овердохуища круто! style.a1b2c3d4.css. Содержимое файла изменилось — хеш новый — имя файла новое. Браузеру хоть кол на голове теши, а старую версию по этому адресу он не найдёт. Вебпак, Вайт и прочие молодцы это делают на раз-два.

Ну и напоследок — для совсем отчаявшихся. Пользователь может сделать жёсткую перезагрузку: зажать Ctrl+Shift+R (или Cmd+Shift+R на маке). Это как пинок под зад браузеру: «забудь всё, что знал, и качай всё заново, мудак!». Но надеяться на это — всё равно что надеяться, что чиновник взятку не возьмёт.