Заставить браузер перезагрузить весь кэш после обновления сайта
есть ли способ заставить клиентов веб-страницы перезагрузить кэш (т. е. изображения, javascript и т. д.) После того, как сервер был перемещен в базу кода? Мы получаем много звонков, спрашивая, почему некоторые функции не работает. Простое жесткое обновление устраняет проблемы при загрузке обновленного файла javascript.
для специфики мы используем Glassfish 3.X. и JSF 2.1.X. Конечно, это относится не только к JSF.
To опишите, какое поведение, я надеюсь, возможно:
веб-сайт A имеет два изображения и два файла javascript. Пользователь посещает сайт, и 4 файла кэшируются. Насколько мне известно, нет необходимости "повторно загружать" указанные файлы, если пользователь специально не заставляет" жесткое " обновление или очищает их кэш. Как только сайт помещает обновление в один из файлов, сервер может иметь какие-то метаданные в заголовке, информирующем клиента об этом обновлении. Если клиент выберет, новые файлы будут загруженный.
то, что я не хочу делать, это поместить мета-тег в заголовок страницы, чтобы ничего не кэшировать...Я просто хочу, чтобы что-то сообщило клиенту об обновлении, и он должен получить последнюю версию после обновления. Я предполагаю, что это будет просто какая-то версия на стороне клиента.
Спасибо за ваше время!
2 ответов
правильный способ справиться с этим-изменить соглашение URL для ваших ресурсов. Мы, например, так:
/resources/js/fileName.js
чтобы браузер по-прежнему кэшировал файл, но делал это правильно с версиями, добавляя что-то в URL. Добавление значения в строку запроса не позволяет кэшировать, поэтому место для его размещения-после /resources/
.
ссылка для кэширования строк запросов: http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.9
например, ваши URL-адреса будут выглядеть так:
/resources/1234/js/fileName.js
Итак, вы можете использовать номер версии проекта (или некоторое значение в файле свойств/конфигурации, которое вы вручную изменяете, когда хотите, чтобы кэшированные файлы были перезагружены), так как это число должны изменить только при изменении проекта. Таким образом, Ваш URL может выглядеть так:
/resources/cacheholder${project.version}/js/fileName.js
это должно быть легко достаточно.
проблема теперь заключается в сопоставлении URL-адреса, так как это значение в середине является динамическим. То, как мы преодолели это с модулем перезаписи URL, который позволил нам фильтровать URL-адреса, прежде чем они попали в наше приложение. Переписывание наблюдало за URL-адресами, которые выглядели так:
/resources/cacheholder______/whatever
и удалены cacheholder_______/
часть. После перезаписи это выглядело как обычный запрос, и сервер отвечал бы с правильным файлом, без какого-либо другого конкретного сопоставления/логики...точка что браузер думал, что это новый файл (хотя на самом деле это не так), поэтому он запросил его, и сервер выясняет это и обслуживает правильный файл (хотя это "странный" URL).
конечно, другой вариант-добавить эту динамическую строку в само имя файла, а затем использовать инструмент перезаписи, чтобы удалить его. В любом случае, то же самое сделали настройки строку текста во время перезаписи и удаления. Это позволяет обмануть браузер, но не сервер :)
обновление:
альтернатива, которая мне очень нравится, - установить имя файла на основе содержимого и кэшировать его. Например, это можно сделать с помощью хэша. Конечно, этот тип вещей - это не то, что вы вручную делаете и сохраняете в своем проекте (надеюсь); это то, что должно обрабатывать ваше приложение/фреймворк. Например, в Grails есть плагин, который" хеширует и кэширует " ресурсы, так что следующее происходит:
- каждый ресурс проверяется
- создается новый файл (или сопоставление с этим файлом) с именем, которое является хэшем его содержимого
- при добавлении
<script>
/<link>
теги на Вашей странице, используется хэшированное имя - когда запрашивается файл с хэш-именем, он служит исходному ресурсу
- файл с хэш-именем кэшируется "навсегда"
что круто в этой настройке, так это то, что вам не нужно беспокоиться о кэшировании правильно-просто установите файлы в кэш навсегда, и хэширование должно заботиться о файлах/сопоставлениях, доступных на основе содержимого. Он также обеспечивает возможность быстрого кэширования и загрузки откатов/отмен.
Я использую параметр no-cache для этих ситуаций... есть строковая константа значение (из файла config)
$no_cache = "v11";
и на страницах, я использую такие активы, как
<img src="a.jpg?nc=$no_cache">
и когда я обновляю свой код, просто измените значение $no_cache, и он работает как шарм.