LINUX.ORG.RU

[велосипедостроительство] Как красивше всего реализовать систему кеширования/версионирования файлов?

 


0

0

Пользователь заходит на сайт, видит какие-то картинки, странички и т.д., которые у него оседают в кеше. Тут администратор сайта меняет картинки (или содержимое страниц), но у пользователя по прежнему отображаются закешированные картинки/старый текст. Иногда нужно жать F5. А если картинки/текст грузили через флеш, то даже F5 не поможет.

Кто как такую проблему решает?

Да, я знаю про заголовки Cache-control и expires. Если кеширование запретить, то пользователь будет материться на долгую загрузку, да и находится он может за проксей, которая принудительно будет кешировать весь контент.

Остается версионирование, т.е. к каждому адресу страниц добавить что-то вроде местного "&nocache=12345". Но если с динамическими страницами все понятно, то как версионировать статику, например, картинки? Не писать же в имени каждого файла версию, вроде "Photo-ver3.jpg"?

Рандом в каждом запросе (Photo.jpg?rand=37456928736) не предлагать - это эквивалентно отключению кеширования.

А зачем рандом? Можно просто Photo.jpg?lastupdate=20090101 где подставлять дату последнего апдейта.

Deleted
()

> как версионировать статику, например, картинки?

js,css, img - дописывай timestamp последней модификации

kelyar ★★★★★
()
Ответ на: комментарий от kelyar

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

kelyar ★★★★★
()

google правильное кэширование

theSoul ★★★
()

Делаю так, перед каждым файлом в темплейте стоит переменная с именем типа imgPrefix, например:

<img src="/images/{$imgPrefix}some.jpg" />

Далее в папке images при апдейте картинок создаю символическую ссылку на сам каталог с именем типа даты: 20090123 -> ./

Ну и соответственно выставляю переменную imgPrefix="20090123/" Все.

Аналогично js файлы.

Про правильное кеширование и т.д. - Expires ставим на месяц вперед, Включаем етаг у апача и все гуд.

If-modified-since проверяется в большинстве браузеров по умолчанию только раз за сессию, а т.к. в последнее время народ сидит сутками - мое решение оказывается достаточно действенным.

roller ★★★
()

>Photo.jpg?rand=37456928736

Я юзал подобный подход, только вместо rand= использовал change time файла на диске.

anonymous
()
Ответ на: комментарий от r_asian

>man "Last-modified" >mna "If-modified-since"

Не очень хороший вариант, ибо запрос на сервер все равно будет. А это траффик, нагрузка (хоть и мизерная).

Для относительно статических данных (JS/картинки) лучше добавить версию, last update time, что-то ещё в URL, такое, что меняется при апгрейде приложения и настроить Expires вообще на бессрочное кеширование (+10 лет, например).

WFrag ★★★★
()
Ответ на: комментарий от roller

>If-modified-since проверяется в большинстве браузеров по умолчанию только раз за сессию, а т.к. в последнее время народ сидит сутками - мое решение оказывается достаточно действенным.

If-Modified-Since проверяется только если надо перевалидировать контент, а это происходит когда наступает Expires (или Cache-Control: max-age). Так что если ты ставишь Expires на месяц вперед, целый месяц браузер вообще не должен ничего у сервера переспрашивать.

WFrag ★★★★
()
Ответ на: комментарий от roller

>http://kb.mozillazine.org/Browser.cache.check_doc_frequency

>Побалуйтесь. И посмотрите дефолтные настройки ИЕ. По крайней мере старых версий.

И что в этой опции такого? Она позволяет заставить браузер проверять страницу чаще, чем этого требует RFC. Я не против такого поведения. Я неправильно выразился, браузер не то, что не должен переспрашивать если Expires не вышел, а просто вправе этого не делать (что и наблюдается при значении 3 этой опции, значения по умолчанию).

WFrag ★★★★
()
Ответ на: комментарий от WFrag

>И что в этой опции такого? Она позволяет заставить браузер проверять страницу чаще, чем этого требует RFC.

И наоборот... Она позволяет проверять РЕЖЕ.

И настройки у старых ие были именно такие. Или их ставили так для экономии траффика.

roller ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.