Заставить браузер перезагрузить весь кэш после обновления сайта

есть ли способ заставить клиентов веб-страницы перезагрузить кэш (т. е. изображения, 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, и он работает как шарм.