Заставить браузер обновить объект в локальном кеше.

camka

не самка
Заставить браузер обновить объект в локальном кеше.

Имеется html страница. На ней изображения. Для уменьшения нагрузки на сервер, поскольку изображения практически никогда не меняются, использую mod_expires.
То есть, при первом запросе браузера к серверу отдается изображение и вместе с ним заголовки, говорящие браузеру, что он может положить их в свой кеш и больше не тревожить сервер своими запросами, когда ему понадобится это изображние, а брать его из своего локального кеша.

Все бы ничего, но в исключительных случаях требуется обновить изображение в кеше браузера до истечения времени жизни этого кешированного объекта, и запросить изображение у сервера заново, как будто его в локальном кеше и нету, и, соответственно обновить локальный кеш новоиспеченным объектом, чтобы в дальнейшем использовать именно его для отображения на странице.

Хорошая новость в том, что скрипт, отображающий страницу, знает, когда надо обновить изображения.
Плохая новость в том, что скрипт никак не может попросить браузер обновить эти изображения, поскольку они являются совершенно другими документами, и запрашиваются отдельно от скрипта, как и диктует специфика http протокола.

Таким образом, насколько я понимаю, никакими заголовками для самой страницы невозможно подать директиву браузеру, чтобы он обновил полностью весь контент для этой страницы, включая изображения, находящиеся на ней, запросив их у сервера, не взирая на то, что они все еще присутствуют в локальном кеше.

Вот было бы что-то типа
Код:
<img src="image.jpg" [B]nocache[/B] >
дак ведь нету.

Может как-то, используя javascript, возможно перезапросить эти изображения у сервера?

Решение с добавлением случайной строки к имени изображения <img src="image.jpg?rnd=alhgkna"> не рассматривается, поскольку необходимо именно обновление локального кеша, а при данной реализации в кеш просто добавляется еще один объект, и при последующих запросах к <img src="image.jpg"> опять будет браться старая версия изображения.
 

camka

не самка
SiMM
По условию задачи, браузер НЕ должен НИКАК запрашивать сервер если объект присутствует в локальном кеше.
 

camka

не самка
Я бы не стал так уверенно утверждать. Возможно, что вы их просто не знаете. Вот для обновления самого тела документа, например, в javascript можно использовать location.reload(true). Возможно что-то подобное есть и для объекта Image ... или еще какие хитрости.

-~{}~ 18.11.05 16:02:

с помощью XMLHttpRequest и
xmlhttp.setRequestHeader("If-Modified-Since", ... )
удалось заново запросить изображение с сервера, однако, по крайней мере в ИЕ, оно упоно не желает перезаписывать то же изображение в кеше браузера.

-~{}~ 18.11.05 16:55:

Даже так: запрашиваю XMLHttpRequest-ом сервер, чтобы он вернул картинку и заголовки Cache-Control: no-cache и соответствующий Expires. Сервер успешно их возвращает. При следующем запросе к странице, браузер послушно запрашивает картинку, потому как предыдущие заголовки сообщили ему о том, что ее не надо больше кешировать. Однако, запрашивать то он ее запрашивает, даже более того, сервер ему ее присылает, но по непонятным мне доселе причинам, браузер отображает ту старую картинку. Сниффером даже видно, что браузер получил именно новую картинку по ее размеру, а отображет он, все равно, старую.

-~{}~ 21.11.05 11:53:

document.location.reload(true) успешно обновляет помимо самой html страницы и все содержащиеся в ней объекты, включая и изображения.
А вы говорите, нет других вариантов.
 

SiMM

Новичок
> А вы говорите, нет других вариантов.
Имеющих отношение к PHP - нет ;)
 

camka

не самка
SiMM
Я сразу отметил, что рассматриваются любые варианты.

Кстати, location.reload(true) не перегружает изображения в Opera. Так что сага продолжается.
 

SiMM

Новичок
> Кстати, location.reload(true) не перегружает изображения в Opera.
Настройками оперы играться пробовали? Вполне возможно, что это их вина.
 

camka

не самка
Не подходит. Я же не стану заставлять всех ползователей своего сайта, использующих Opera, играться с этими настройками. А настройки у меня по умолчанию.
 

SiMM

Новичок
> Я же не стану заставлять всех ползователей своего сайта, использующих Opera, играться с этими настройками.
Хы... ну вообще-то это пользователю решать - какие настройки браузера ему больше подходят ;)
 

camka

не самка
t3[0one]
Пробовал. При присвоении аттрибута src картинка успешно тянется из кеша.

SiMM
Ну право же ...
 

SiMM

Новичок
> +Math.random()
Тогда уж дату/таймштамп создания/изменения файла, исходя из задачи.
 

camka

не самка
eddie
Я же написал, что такой вариант не рассматривается, поскольку та же картинка, но с новым именем представляет совершенно иной объект кеша. При последующих запросах к image.jpg будет возвращаться тот же устаревший объект.
 
Сверху