Есть ли способ заставить браузеры обновлять / загружать изображения?

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

Есть ли способ (я подумал, может быть, для этого может быть метатег), чтобы браузер не использовал его cahce?

Лучший ответ - переименовать изображение во что-нибудь совершенно новое. Я буду работать над этим, но пока это быстрое решение, пока я работаю над более серьезной проблемой.


person uriDium    schedule 16.09.2009    source источник


Ответы (14)


Добавьте строку запроса с произвольным уникальным номером (или временем, или номером версии и т. Д.):

<img src="image.png?80172489074" alt="a cool image" />

Это приведет к новому запросу из-за другого URL-адреса.

person knittl    schedule 16.09.2009
comment
+1, но, строго говоря, это не другое имя файла ;-) Компонент имени файла такой же, но URL-адрес, безусловно, другой. - person Michael Krelin - hacker; 16.09.2009
comment
Gubmo, unique - это многовато, лучше всего в этом случае добавить mtime файла - таким образом он будет перезагружаться только при необходимости. - person Michael Krelin - hacker; 16.09.2009
comment
Лучше всего использовать номер версии выпуска. - person rahul; 16.09.2009
comment
@hacker: случайность не гарантирует, что два сгенерированных значения могут не совпадать. Но уникальность гарантирует, что два сгенерированных значения не идентичны. И разве дата модификации этого файла не уникальна для этого файла? - person Gumbo; 16.09.2009
comment
Gumbo, вы, конечно, можете использовать хэш над содержимым файла, но в основном вы хотите, чтобы файл перезагружался всякий раз, когда он изменяется, и это когда метка времени обновляется в случае нормального рабочего процесса. Вы не хотите, чтобы файл безоговорочно перезагружался при каждом запросе. Кроме того, вы не хотите, чтобы он был уникальным для файла - уникальность обеспечивается уникальностью комбинации имени файла + строки запроса. - person Michael Krelin - hacker; 16.09.2009
comment
но если вы добавите? 123, например, один раз и не трогаете его, изображение все равно будет кэшироваться правильно. Я предполагаю, что он будет повторно кэшироваться, только если вы измените его на что-то другое, чем? 123 - person Robert Sinclair; 09.10.2018
comment
@RobertSinclair, да, именно так. Каждый URL-адрес будет кэшироваться независимо. Вот почему вы можете, например, добавить время модификации файла, номер версии или хэш файла, чтобы принудительно обновить браузер при изменении базового файла. - person knittl; 09.10.2018
comment
Используйте? ГГММДД-ЧЧММСС времени, когда пользователь обновлял свое изображение. Таким образом, изображение будет перезагружено только в том случае, если оно было изменено. Не при каждой перезагрузке браузера. - person Daniel Wu; 11.01.2021

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

  • Использование заголовка expires с датой в прошлом предотвращает кеширование. Плохой
  • Добавление параметра «перебор кеша» 342038402 может решить проблему, но также может предотвратить кэширование изображения, чего вы не хотите. Плохой.
  • Лучше использовать заголовок expires с коротким (скажем, 1 час) истечением ... через час пользователь увидит изображение, но вашему веб-серверу не придется обслуживать его каждый раз. Компромисс, а в какое время работает? Не совсем осуществимо.

Решение? Я могу придумать два хороших варианта:

  • Изучите eTags и свою способность их использовать. Они предназначены для этой ситуации. Браузер явно спросит ваш сервер, актуален ли файл или нет. Вы можете просто включить это в apache, если у вас его еще нет.
  • Создайте новый URL-адрес для каждого нового изображения (и используйте заголовок с истекшим сроком действия в далеком будущем). Это то, над чем вы работаете.
person ndp    schedule 16.09.2009
comment
‹Quote› Добавление очистки кеша ... Плохо. ‹/Quote› Это неправда, это заставит браузер кэшировать эту конкретную версию изображения, поэтому image.png? 342038402 будет кэшироваться как эта версия. Если у вас одно и то же изображение с другой строкой запроса, это плохо. - person michaelmol; 21.09.2015
comment
michaelmol, а тогда вам придется вручную создавать новое случайное число при каждом изменении изображения? Я понимаю, вы не хотите, чтобы это никогда не кешировалось. используя эту технику, я не вижу способа просто загрузить изображение в одноименное место и попросить что-нибудь программно обновить путь новым случайным числом - person AZ Chad; 11.01.2017
comment
@ChadMizner При использовании PHP вы можете использовать функцию PHP filemtime(string $filename) в сочетании с функцией параметр очистки кеша. Таким образом, URL-адрес этого файла будет изменяться каждый раз, когда запрашиваемый файл был изменен. (Кредиты Михаилу Крелину - хакеру). - person RicoBrassers; 10.02.2017
comment
Неважно, изменили ли вы значение, прикрепленное к URL-адресу изображения, или нет. Как только в конце будет ЧТО-ТО, ваш браузер получит новую копию с сервера (даже если это значение не изменилось). Вот почему это ПЛОХО! - person Ben Bozorg; 06.07.2017

Мое любимое PHP-решение:

<img src="<?php echo "image.jpg" . "?v=" . filemtime("image.jpg"); ?>" />

каждое изменение файла создает новую версию файла

person Gianluca Demarinis    schedule 30.07.2019

Добавьте текущую дату и время к src изображения:

<img src="yourImage.png?v=<?php echo Date("Y.m.d.G.i.s")?>" />
person Rob Vanders    schedule 05.12.2012
comment
Вы также можете отключить кеширование, потому что ваш пример заставит браузеры загружать файлы каждый раз (потому что метка времени будет меняться каждую секунду). Я бы предложил удалить i и s в конце, чтобы метка времени менялась каждый час. Таким образом, браузеры будут загружать изображения только один раз в час. Y.m.d.G - person Shumoapp; 10.03.2017

Вы можете поместить http-equiv в тег <meta>, который укажет браузеру не использовать кеш (или даже лучше - использовать его определенным образом), но лучше настроить сервер для отправки правильных заголовков http cache. Прочтите статью о кешировании.

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

person samuil    schedule 16.09.2009
comment
Напротив, использование обходных путей поддерживает плохую поддержку браузерами этих идей;) Я понимаю вашу точку зрения и знаю, что дальнейшее обсуждение обычно ни к чему не приводит - что-то лучше, но не работает так, как задумано, что-то хуже, но работает. Все зависит от веб-разработчика, что он выберет. - person samuil; 16.09.2009

вы можете управлять поведением кеша, играя с заголовками HTTP.

установка заголовка expires в прошлом заставит браузер не использовать кешированную версию.

Expires: Sat, 26 Jul 1997 05:00:00 GMT

Дополнительную информацию можно найти в RFC.

person RageZ    schedule 16.09.2009
comment
Проблема RageZ здесь в том, что вам также придется попросить разработчиков определенных браузеров проконсультироваться с RFC. - person Michael Krelin - hacker; 16.09.2009
comment
да ... но хотя бы этот документ соответствующий. после реализации глюк вроде ... - person RageZ; 16.09.2009
comment
Я за правильную реализацию, но надо иметь дело с реальностью. - person Michael Krelin - hacker; 16.09.2009
comment
Большинство браузеров реализуют это правильно, вернувшись к дням IE6, которые были уродливыми, но теперь все должно быть в порядке. - person RageZ; 16.09.2009
comment
Браузер не будет (не должен) использовать кешированную версию , если он запрашивает изображение из своего HTTP-кеша. Однако, если браузер имеет копию изображения в памяти, он иногда просто использует ее, даже не запрашивая свой кеш. Добавьте уникальный идентификатор фрагмента к URL-адресу изображения, чтобы убедиться, что он не использует копию изображения в памяти. - person Doin; 15.03.2014

Если вы посмотрите на данные, которыми обмениваются ваш браузер и сервер, вы увидите, что браузер отправляет HTTP-запрос HEAD для изображений. Результат будет содержать время модификации (но не фактические данные изображения). Убедитесь, что это время изменилось, если изображение изменилось на сервере и браузер должен снова загрузить изображение.

person Aaron Digulla    schedule 16.09.2009
comment
Зависит от браузера - метод уменьшения задержки заключается в использовании заголовка If-Modified-Since в запросе GET. Последствия все те же - убедитесь, что вы правильно указали время модификации файла, чтобы инвалидация кеша работала правильно. - person Toby Speight; 27.10.2017

в PHP вы можете использовать этот трюк

<img src="image.png?<?php echo time(); ?>" />

Функция time () показывает текущую отметку времени. Каждая страница загружается по-разному. Таким образом, этот код обманывает браузер: он читает другой путь и «думает», что изображение изменилось с тех пор, как пользователь посетил сайт в последний раз. И он должен его повторно загрузить, а не использовать кеш-память.

person Gianluca Demarinis    schedule 27.10.2017

Иди в случайном порядке. Просто используйте какое-нибудь случайное число и добавьте его к имени файла изображения.

<img src="image.jpg?<?=rand(1,1000000)?>">
person stackFan    schedule 12.02.2018
comment
вместо этого попробуйте использовать дату последней модификации файла. поэтому вы можете скачать новый файл только в том случае, если он был изменен - person Gianluca Demarinis; 30.07.2019

Еще одно мощное решение:

<img src="image.png?v=<?php echo filemtime("image.png"); ?>" />

Это напечатает «отметку времени последней модификации» на пути.

Новая версия -> Скачать новое изображение

Та же версия -> Взять кеш

person Gianluca Demarinis    schedule 12.06.2020

В PHP вы можете отправить случайное число или текущую отметку времени:

<img src="image.jpg?<?=Date('U')?>">

or

<img src="image.jpg?<?=rand(1,32000)?>">
person Arvy    schedule 14.01.2014

Похоже, проблема больше в том, что основной пользователь видит свое новое изображение, чем в том, что кеш полностью отключен? В этом случае вы можете сделать следующее:

var headers = new Headers()
headers.append('pragma', 'no-cache')
headers.append('cache-control', 'no-cache')

var init = {
  method: 'GET',
  headers: headers,
  mode: 'no-cors',
  cache: 'no-cache',
}

fetch(new Request('path/to.file'), init)

Если вы сделаете это после загрузки нового изображения, браузер должен увидеть эти заголовки и позвонить в серверную часть, пропуская кеш. Новое изображение теперь находится в кеше по этому URL-адресу. Основной пользователь увидит новое изображение, но вы по-прежнему сохраните все преимущества кэширования. Любой другой, просматривающий это изображение, увидит обновления примерно через день после того, как их кеш станет недействительным.

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

person Ben Matheson    schedule 04.12.2019

Я столкнулся с этой проблемой несколько раз назад. И я получал данные через JSON в AJAX. Я просто добавил функцию Javascript Math.random (), и она отлично сработала. Бэкэнд, который я использовал, был флягой.

<img class="card-img-top w-100 d-block" style="padding:30px;height:400px" src="static/img/${data.image}?${Math.random()} ">

person Manish Meshram    schedule 21.04.2020

это был неприятный результат, я думаю, это способ правильно его запрограммировать.

 <td><?php echo "<img heigth=90 width=260 border=1 vspace=2 hspace=2 src=".$row['address']."?=".rand(1,999)."/>" ?></td>
person tijntest    schedule 01.05.2015