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

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

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

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

Ответы [ 10 ]

114 голосов
/ 16 сентября 2009

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

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

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

21 голосов
/ 16 сентября 2009

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

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

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

  • Посмотрите на eTags и ваши возможности их использовать. Они предназначены для этой ситуации. Браузер явно спросит ваш сервер, актуален ли файл. Вы можете просто включить это в apache, если у вас его нет.
  • Создайте новый URL для каждого нового изображения (и используйте заголовок с истекшим сроком давности). Это то, над чем вы работаете.
4 голосов
/ 16 сентября 2009

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

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

3 голосов
/ 06 декабря 2012

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

<img src="yourImage.png?v=<?php echo Date("Y.m.d.G.i.s")?>" />
2 голосов
/ 16 сентября 2009

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

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

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

Вы можете обратиться к RFC , чтобы получить более подробную информацию.

1 голос
/ 12 февраля 2018

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

<img src="image.jpg?<?=rand(1,1000000)?>">
1 голос
/ 27 октября 2017

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

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

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

1 голос
/ 16 сентября 2009

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

0 голосов
/ 01 мая 2015

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

 <td><?php echo "<img heigth=90 width=260 border=1 vspace=2 hspace=2 src=".$row['address']."?=".rand(1,999)."/>" ?></td>
0 голосов
/ 14 января 2014

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

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

или

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