Если я правильно понял, то браузеры кэшируют изображения, файлы JS и т. Д. На основе имени файла. Таким образом, существует опасность, что если один такой файл будет обновлен (на сервере), браузер будет использовать вместо него кешированную копию.кеширование на стороне клиента
Обходной путь для этой проблемы состоит в том, чтобы переименовать все файлы (как часть сборки), так что имя файла содержит хеш MD5 его содержимого, например.
foo.js -> foo_AS577688BC87654.js
me.png -> me_32126A88BC3456BB.png
Однако, помимо переименования самих файлов, все ссылки на эти файлы должны быть изменены. Для exmaple тег, такой как <img src="me.png"/>
, должен быть изменен на <img src="me_32126A88BC3456BB.png"/>
.
Очевидно, что это может стать довольно сложным, особенно если учесть, что ссылки на эти файлы могут быть динамически созданы внутри серверного кода.
Конечно, одним из решений является полное отключение кэширования в браузере (и любые кеши между сервером и браузером) с использованием HTTP-заголовков. Однако отсутствие кэширования создаст собственный набор проблем.
Есть ли лучшее решение?
Спасибо, Дон
Это действительно проблема? Современные браузеры будут проверять, по крайней мере, один раз за сеанс, если не обновлять каждую страницу, чтобы увидеть, обновляется ли изображение или js или другой файл, на который делается ссылка, добавив заголовок if-modified-since в свой запрос. Если файл не изменен, веб-сервер вернет 304, и браузер будет использовать кешированный файл. – GrandmasterB
Я заметил случай, когда Safari не обновлял кеш, несмотря на использование пользователем F5. К сожалению, я не делал глубокого обзора, так как он был по телефону, и только клиент просматривал его в то время, поэтому я попросил пользователя очистить кеш браузера, а затем Safari схватил новую версию. –
* на основе имени файла * - не совсем, см. ETags: http://en.wikipedia.org/wiki/HTTP_ETag. Что бы вы сделали, используется ваш хеш в качестве ETag ресурса. – Douglas