Я изменил файлы js и css на своем веб-сайте. Но браузер по-прежнему извлекает содержимое из локального кеша, потому что браузер сохранил его. Я хочу получить свежий контент с сервера, не очищая локальный кеш. Ранее для заголовка max-age был задан 1 год. Теперь я установил его на 0. По-прежнему не загружает свежий контент.
Есть ли способ отправить заголовки с сервера в браузер, и он будет извлекать новое содержимое, игнорируя предыдущие файлы, хранящиеся в локальном кеше.
Спасибо
Если браузер кэшировал актив с неистекшим временем, то нет никакого способа заставить его перезагрузить актив. Именно это и есть кеширование - инструкция о том, что использовать актив в течение этого периода времени безопасно.
Вы не можете просто добавить кэширующие заголовки и ожидать, что браузеры, которые уже загрузили этот ресурс, заберут эти новые заголовки - они не будут загружать файл, пока у них есть действующая кешированная версия! Единственное исключение из этого - если пользователь выполняет перезагрузку (F5 в Chrome) или принудительную перезагрузку (Ctrl + F5 в Chrome).
Есть разные типы и методы разрыва кэша, которые включают изменение ссылки на ресурс (например, вы обновляете свою страницу со ссылки main.css на main_v2.css или main.css? version = 2). Это зависит от того, действительно ли страница не кэшируется. Лично я считаю, что это немного бесполезно (сколько людей начинают с домашней страницы, затем щелкают страницу, затем возвращаются на домашнюю страницу и требуют как минимум 304 повторной проверки?), Поэтому я предпочитаю по-прежнему кешировать страницы, но с короткий срок действия, но это уже другая проблема.
Казалось бы, ответом на все это будет использование must-revalidate
заголовок, но успешная стратегия кэширования направлена как на предотвращение необходимости повторной загрузки кэшируемого актива, так и на предотвращение его даже проверки. Эти вызовы проверки (которые приводят к ответу «304 Not Modified», а не к полной загрузке, если файл все еще тот же на сервере) действительно занимают немало времени, особенно если на странице много ресурсов, поэтому их использование решает только половину проблемы - лучше полностью кэшировать на определенный период времени, а затем использовать 304 секунды для повторной проверки по истечении этого времени.
Гораздо более интересный вариант управления кешем - устаревший во время повторной валидации, что позволяет, например, кэшировать актив на 1 час, но повторно использовать его еще 2 часа, пока браузер повторно проверяет его в фоновом режиме для следующего раза. Таким образом, это дает механизм повторной проверки и обновления без потери производительности при каждой предварительной проверке. Однако в настоящее время для этого нет поддержки браузером (через Хром и Fire Fox посмотрел на это).
Наконец, один комментарий к вашему вопросу предполагает использование HTTP / 2 для отправки нового актива. Теоретически это хорошо, но HTTP / 2 push так не работает (хотя было высказано предположение, что, возможно, так и должно быть - именно по этой причине). Вместо этого HTTP / 2 push поддерживает свой собственный «push-кеш», а затем браузер загружает элементы в свой «основной кеш», когда это необходимо. Но он всегда сначала проверяет свой «основной кеш» и не проверяет «push-кеш», если его там нет. Таким образом, это в основном порядок приоритета «основной кеш», «push-кеш», «сервер», и используется первое действительное попадание.
послать Cache-control: no-cache
чтобы указать принимающим браузерам освободить запись в кеше. Это должно быть отправлено для каждого объекта в кеше, поэтому, вероятно, лучше сделать это с помощью сценария.