Задний план
Я пишу и использую очень простой инструмент управления контентом на основе CGI (Perl) для двух бесплатных веб-сайтов. Он предоставляет администратору веб-сайта HTML-формы для событий, в которых они заполняют поля (дата, место, заголовок, описание, ссылки и т. Д.) И сохраняют их. В этой форме я разрешаю администратору загрузить изображение, связанное с событием. На странице HTML, отображающей форму, я также показываю предварительный просмотр загруженного изображения (тег HTML img).
Эта проблема
Проблема возникает, когда администратор хочет изменить картинку. Ему просто нужно было нажать кнопку «Обзор», выбрать новое изображение и нажать ОК. И это прекрасно работает.
После загрузки изображения мой серверный CGI обрабатывает загрузку и правильно перезагружает форму.
Проблема в том, что показанное изображение не обновляется. Старое изображение по-прежнему отображается, даже если в базе данных содержится правильное изображение. Я сузил его до того факта, что ИЗОБРАЖЕНИЕ КЕШЕНО в веб-браузере. Если администратор нажимает кнопку ПЕРЕЗАГРУЗИТЬ в Firefox / Explorer / Safari, все обновляется нормально и просто появляется новое изображение.
Мое решение - не работает
Я пытаюсь управлять кешем, написав инструкцию HTTP Expires с датой, очень далекой от прошлого.
Expires: Mon, 15 Sep 2003 1:00:00 GMT
Помните, что я нахожусь на административной стороне, и мне все равно, если загрузка страниц занимает немного больше времени, потому что у них всегда истекает срок действия.
Но это тоже не работает.
Ноты
При загрузке изображения его имя файла не сохраняется в базе данных. Он переименован в Image.jpg. (для простоты использования). При замене существующего изображения на новое имя также не меняется. Меняется только содержимое файла изображения.
Веб-сервер предоставляется хостинг-сервисом / интернет-провайдером. Он использует Apache.
Вопрос
Есть ли способ заставить веб-браузер НЕ кэшировать данные с этой страницы, даже изображения?
Я жонглирую возможностью фактически «сохранить имя файла» с базой данных. Таким образом, если изображение будет изменено, src тега IMG также изменится. Однако для этого потребуется много изменений по всему сайту, и я бы предпочел не делать этого, если у меня есть лучшее решение. Кроме того, это все равно не сработает, если новое загруженное изображение имеет то же имя (скажем, изображение немного отфотошоплено и повторно загружено).
источник
Ответы:
Армин Ронахер правильно понял. Проблема в том, что случайные строки могут конфликтовать. Я хотел бы использовать:
Где «1222259157.415» - текущее время на сервере.
Генерация времени с помощью Javascript
performance.now()
или Python с помощьюtime.time()
источник
Простое исправление: прикрепите к изображению случайную строку запроса:
Что говорит HTTP RFC:
Но это не так хорошо :)
источник
Я использую функцию времени изменения файла PHP , например:
Если вы измените изображение, то будет использоваться новое изображение, а не кэшированное из-за другой измененной метки времени.
источник
Я хотел бы использовать:
где «20130910043254» - время модификации файла.
Я думаю, есть два типа простых решений: 1) те, которые приходят в голову первыми (простые решения, потому что их легко придумать), 2) те, которые вы получаете после обдумывания вещей (потому что их легко использование). Видимо, вы не всегда будете получать выгоду, если решите все обдумать. Но я считаю, что второй вариант сильно недооценен. Подумаешь, почему
php
так популярно;)источник
images.php
). Этот сценарий необходимо повторно создавать при каждой фиксации и устраняет накладные расходы на определение времени модификации файлов.используйте Class = "NO-CACHE"
образец html:
JQuery:
JavaScript:
Результат: src = "images / img1.jpg" => src = "images / img1.jpg? A = 0.08749723793963926"
источник
Вы можете написать прокси-скрипт для обслуживания изображений - но это немного больше работы. Что-то вроде этого:
HTML:
Автор сценария:
На самом деле должно быть достаточно либо заголовков без кеширования, либо случайного числа в src изображения, но поскольку мы хотим быть пуленепробиваемыми ...
источник
Я НОВЫЙ кодировщик, но вот что я придумал, чтобы браузер не кэшировал и не сохранял изображения с моей веб-камеры:
Не уверен, что работает в каком браузере, но для некоторых это работает: IE: работает, когда веб-страница обновляется и когда веб-сайт повторно посещается (без обновления). ХРОМ: работает только при обновлении веб-страницы (даже после повторного посещения). САФАРИ и iPad: не работает, мне нужно очистить историю и веб-данные.
Есть идеи по SAFARI / iPad?
источник
Измените это, и вы устранили свою проблему. Я использую метки времени, как и в решениях, предложенных выше: Image- <timestamp> .jpg
По-видимому, любые проблемы, которых вы избегаете, сохраняя одно и то же имя файла для изображения, можно преодолеть, но вы не говорите, что они собой представляют.
источник
Я проверил все ответы в Интернете, и, похоже, лучший из них: (на самом деле это не так)
вначале.
Однако, если вы добавите параметр cache = none (статическое слово «none»), это ни на что не повлияет, браузер по-прежнему загружается из кеша.
Решение этой проблемы было:
где вы в основном добавляете временную метку unix, чтобы сделать параметр динамическим и без кеша, это сработало.
Однако моя проблема была немного другой: я загружал на лету сгенерированное изображение php-диаграммы и контролировал страницу с параметрами $ _GET. Я хотел, чтобы изображение читалось из кеша, когда параметр URL GET остается неизменным, и не кешировалось при изменении параметров GET.
Чтобы решить эту проблему, мне нужно было хешировать $ _GET, но поскольку это массив, вот решение:
Редактировать :
Хотя приведенное выше решение работает нормально, иногда вам нужно обслуживать кешированную версию ДО тех пор, пока файл не будет изменен. (с указанным выше решением он полностью отключает кеш для этого изображения) Итак, для обслуживания кэшированного изображения из браузера ДО ТОГО, как изменится использование файла изображения:
источник
filemtime
Решение лучше и потому , чтоmd5
занимает много вычислительной мощности.Ваша проблема в том, что, несмотря на
Expires:
заголовок, ваш браузер повторно использует сохраненную в памяти копию изображения до его обновления, а не даже проверяет свой кеш.У меня была очень похожая ситуация с загрузкой изображений продуктов в бэкэнде администратора для сайта, похожего на магазин, и в моем случае я решил, что лучшим вариантом было бы использовать javascript для принудительного обновления изображения без использования каких-либо методов изменения URL-адресов других людей уже упоминали здесь. Вместо этого я помещаю URL-адрес изображения в скрытый IFRAME, называемый
location.reload(true)
в окне IFRAME, а затем заменяю свое изображение на странице. Это приводит к обновлению изображения не только на той странице, на которой я нахожусь, но и на всех последующих страницах, которые я посещаю, без необходимости запоминания ни клиентом, ни сервером каких-либо параметров строки запроса URL или идентификатора фрагмента.Я разместил код для этого в своем ответе здесь .
источник
Добавить отметку времени
<img src="picture.jpg?t=<?php echo time();?>">
всегда даст вашему файлу случайный номер в конце и остановит его кеширование
источник
Поскольку между вами и клиентом могут возникать прозрачные прокси с плохим поведением, единственный способ полностью гарантировать, что изображения не будут кэшироваться, - это дать им уникальный uri, что-то вроде отметки времени как строки запроса или как части дорожка.
Если эта метка времени соответствует времени последнего обновления изображения, вы можете кэшировать, когда вам нужно, и обслуживать новое изображение в нужное время.
источник
Я предполагаю, что исходный вопрос касается изображений, хранящихся с некоторой текстовой информацией. Итак, если у вас есть доступ к текстовому контексту при генерации src = ... url, рассмотрите возможность сохранения / использования CRC32 байтов изображения вместо бессмысленной случайной метки или отметки времени. Затем, если отображается страница с большим количеством изображений, перезагружаются только обновленные изображения. В конце концов, если сохранение CRC невозможно, его можно вычислить и добавить к URL-адресу во время выполнения.
источник
С моей точки зрения, отключать кеширование изображений - плохая идея. Вообще.
Основная проблема здесь - как заставить браузер обновлять изображение, когда оно было обновлено на стороне сервера.
Опять же, с моей личной точки зрения, лучшее решение - отключить прямой доступ к изображениям. Вместо этого обращайтесь к изображениям через серверный фильтр / сервлет / другие аналогичные инструменты / службы.
В моем случае это сервис отдыха, который возвращает изображение и в ответ прикрепляет ETag. Сервис хранит хеш всех файлов, при изменении файла хеш обновляется. Он отлично работает во всех современных браузерах. Да, на это нужно время, но оно того стоит.
Единственное исключение - это фавиконы. По каким-то причинам не работает. Я не мог заставить браузер обновлять кеш со стороны сервера. Заголовки ETags, Cache Control, Expires, Pragma ничего не помогли.
В этом случае, кажется, единственное решение - добавить какой-нибудь параметр random / version в url.
источник
В идеале вы должны добавить кнопку / привязку клавиш / меню к каждой веб-странице с возможностью синхронизации содержимого.
Для этого вы должны отслеживать ресурсы, которые могут нуждаться в синхронизации, и либо использовать xhr для проверки изображений с помощью динамической строки запроса, либо создавать изображение во время выполнения с помощью src с использованием динамической строки запроса. Затем используйте механизм широковещания, чтобы уведомить все компоненты веб-страниц, которые используют ресурс для обновления, чтобы использовать ресурс с динамической строкой запроса, добавленной к его URL-адресу.
Наивный пример выглядит так:
Обычно изображение отображается и кэшируется, но если пользователь нажал кнопку, на ресурс отправляется запрос xhr с добавленной к нему строкой запроса времени; поскольку можно предположить, что время будет разным для каждого нажатия, он будет следить за тем, чтобы браузер обходил кеш, поскольку он не может определить, генерируется ли ресурс динамически на стороне сервера на основе запроса, или это статический ресурс, игнорирующий запрос.
В результате вы можете избежать того, чтобы все ваши пользователи постоянно бомбардировали вас запросами ресурсов, но в то же время разрешите пользователям обновлять свои ресурсы, если они подозревают, что они не синхронизированы.
источник
Я сделал сценарий PHP, который автоматически добавляет отметки времени для всех изображений на странице HTML. Вам просто нужно включить этот скрипт на свои страницы. Наслаждайтесь!
http://alv90.altervista.org/how-to-force-the-browser-not-to-cache-images/
источник
Вы должны использовать уникальные имена файлов. Как это
Но этот метод означает высокую загрузку сервера и потерю полосы пропускания. Вместо этого вы должны использовать номер версии или дату. Пример:
Но вы хотите, чтобы он никогда не загружал изображение из кеша. Для этого, если страница не использует кеш страницы , это возможно с PHP или на стороне сервера.
Однако это все еще не эффективно. Причина: кеш браузера ... Последний, но наиболее эффективный метод - это Native JAVASCRIPT. Этот простой код находит все изображения с классом «NO-CACHE» и делает изображения почти уникальными. Поместите это между тегами скрипта.
ИСПОЛЬЗОВАНИЕ
РЕЗУЛЬТАТ (ы) как это
источник