Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   JS загружает изображение всегда с локального кэша - почему? (https://javascript.ru/forum/misc/41874-js-zagruzhaet-izobrazhenie-vsegda-s-lokalnogo-kehsha-pochemu.html)

buhpro 02.10.2013 16:05

JS загружает изображение всегда с локального кэша - почему?
 
В общем для экономии трафика изображения возвращаю через ПХП. В заголовке возвращаю Last-Modified: со временем файла изображения, затем анализирую параметр при следующем обращении "If-Modified-Since" и если их время одинаково - то возвращаю код 304.
Если изображение загружается в HTML - то все ок. Т.е. первый раз изображение грузится с кодом 200, а затем (если файл не изменился) с кодом 304.
Если же изображение загружается из JS - то в первый раз код 200, а в последующие ВСЕГДА код 200 и сообщение что браузер берет его из локального кэша - т.е. изображение застревает в кэше браузера навечно.
Как заставить JS обращаться к серверу при последующих вызовах а не брать все из локального кэша ???

Вот пример корректной работы из HTML

<img src="/pages/list_foto.php?foto=../foto/avtoisgermanii.jpg&size=80">



А вот неправильной работы из JS:

pic1 = new Image();

pic1.src = '/pages/list_foto.php?foto=../foto/avtoisgermanii.jpg&size=200';

//		$('<img src="' + src + '">').appendTo('.full');


Если IMG в HTML - то браузер действует так: В первый раз запрашивает изображение с сервера и кэширует его, в последующие разы делает запрос на сервер с пар-ром If-Modified-Since, в котором указывает время создания файла из своего кэша и если получает с сервера код 304 - то изображение берется с локального кэша.

Если IMG добавляется из JS - то браузер в первый раз запрашивает изображение с сервера и кэширует его, а в последующие разы на сервер вообще не обращается а ВСЕГДА берет изображение из кэша.

Почему ????????

ruslan_mart 02.10.2013 17:05

var pic1 = new Image();
pic1.src = '/pages/list_foto.php?foto=../foto/avtoisgermanii.jpg&size=200&hash=' + Math.random(0,9999999);
$('.full').append(pic);


Должно сработать. ;)

buhpro 02.10.2013 17:21

Цитата:

Сообщение от Ruslan_xDD (Сообщение 274724)
var pic1 = new Image();
pic1.src = '/pages/list_foto.php?foto=../foto/avtoisgermanii.jpg&size=200&hash=' + Math.random(0,9999999);
$('.full').append(pic);


Должно сработать. ;)

Так это не выход - так вообще отключается кэширование изображения и сервер вообще упадет.
Выходит - хотите малую нагрузку на сервер - то навсегда забудьте о JS, Ajax, а используйте HTML + PHP.
А кто делает наполнение из JS - все отключают кэш таким вот образом :cray:

Deff 02.10.2013 20:49

Цитата:

Сообщение от buhpro (Сообщение 274729)
Так это не выход - так вообще отключается кэширование изображения и сервер вообще упадет.
Выходит - хотите малую нагрузку на сервер - то навсегда забудьте о JS, Ajax, а используйте HTML + PHP.
А кто делает наполнение из JS - все отключают кэш таким вот образом :cray:

Дык вы с сервера отсылайте изо таким макаром
<img src="/pages/list_foto.php?foto=../foto/avtoisgermanii.jpg?1380732233">
Cинее - время последнего изменения картинки

Тогда(Если стирать предыдущее изо,) и загрузка с Js - будет давать ошибку
pic1.src = '/pages/list_foto.php?foto=../foto/avtoisgermanii.jpg?1380732233'


по ошибке грузите чисто
pic1.src = '/pages/list_foto.php?foto=../foto/avtoisgermanii.jpg';

danik.js 02.10.2013 21:01

Выставлены ли заголовки Cache-Control и Expires? Другие заголовки, причастные к кэшированию?


Часовой пояс GMT +3, время: 15:24.