У меня есть список объектов, который также содержит миниатюру изображения. Иногда я должен изменить изображение миниатюр, но сохранить имя файла тем же. Существует ли способ вынудить браузер загрузить недавно загруженное изображение, вместо того, чтобы захватить один от кэша браузера?
Это является очень подходящим, когда люди обновляют свои аватары, который вызывает беспорядок для некоторых пользователей, которые продолжают видеть их старый аватар, пока они не очищают кэш браузера или перезапускают браузер.
Вы можете сделать недействительным кеш для всей страницы, изменив заголовки :
<?php
header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>
Вы можете использовать время модификации файла:
<?
$filename = 'avatar.jpg';
$filemtime = filemtime($filename);
echo "<img src='".$filename."?".$filemtime."'>";
//result: <img src='avatar.jpg?1269538749'>
?>
при изменении файла очищается кеш клиента
При отправке изображения убедитесь, что не отправляете заголовок Expires
. Также рассмотрите возможность отправки этого заголовка кэша:
Cache-Control: must-revalidate
Это заставит браузер каждый раз запрашивать изображение у вашего сервера. Следите за наличием заголовка If-Modified-Since в запросе; если изображение не было изменено, ответьте HTTP-кодом 304.
Вся эта процедура (must-revalidate, If-Modified-Since, ответ 304) позволит браузеру кэшировать содержимое изображения, но в то же время запрашивать ваш сервер, если файл изменился.
Другое, возможно, более простое решение - устанавливать заголовок Expires
только на короткое время в будущем, например, на десять минут, и информировать пользователя о десятиминутной задержке. Это ускорит загрузку большинства страниц, так как отпадет необходимость выполнять HTTP-запрос к изображению.