2009-11-19 3 views
2

Правильно, моя проблема в том, что мне нужно заменить изображение, которое появляется на каждой странице сайта, что хорошо, проблема в том, что я хочу, чтобы каждый пользователь видел новое изображение, а не кешированную версию Старый. Это особенно сложно, потому что я не могу делать какие-либо изменения кода (слишком много мест, чтобы сделать это для его жизнеспособности), поэтому мне нужно заменить изображение на сервере новым одноименным именем. Не только это, но и страницы довольно тяжелые, поэтому я не хочу, чтобы вся страница полностью перезагружалась каждый раз, когда запрашивалась страница.Проблема с кешированным изображением

Я думаю, что лучшим способом было бы сделать что-то в IIS, что заставит новое изображение на кого-то, у кого его уже нет. Заголовки Last-Modified или Expires HTTP, где моя первая остановка, но я могу найти способ заставить их работать против одного элемента, а не всей страницы.

Любая помощь/идеи были бы фантастическими!

Спасибо, Том.

+0

Спасибо за помощь. Я позволю тебе знать, что я делаю. – 2009-11-20 08:30:54

ответ

0

HTTP-заголовки всегда применяются только к одному элементу. В случае тех, которые установлены на самой странице, они применяются только к странице, а не к связанным ресурсам.

Браузеры и HTTP-кеши в дикой природе будут иметь кешированные копии этого изображения. Невозможно заставить их перезагрузить изображение, не изменяя URL-адрес изображения (о котором вы заявили, что не можете сделать).

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

Для получения более постоянных изменений вам необходимо выяснить, как IIS устанавливает заголовки для ваших статических файлов. Я подозреваю, что он устанавливает все заголовки равномерно для всех файлов, но может быть способ переопределить заголовки для определенного файла. Если нет, вы должны учесть запрос на этот URL-адрес в скрипте, который устанавливает заголовки перед доставкой содержимого. В этом случае то, что вы хотите сделать, задается заголовком Expires или max-age, чтобы браузеры знали, как долго они должны хранить этот элемент в кеше. Обратите внимание, что эти заголовки будут применяться только к будущим запросам для этого файла.

Ввод этих заголовков на самих страницах не повлияет на запросы на файл.Будьте осторожны при добавлении заголовков кеш-контроля, поскольку ваш сайт может работать неправильно, если неправильные вещи кэшируются слишком агрессивно; альтернативно, ваша пропускная способность может скапливаться, поскольку вещи не кэшируются, что должно быть.

Для дальнейшего рассмотрения вы должны изменить пути статических ресурсов при изменении содержимого. Это дает понять браузеру, что этот файл является новым, потому что в этом пути не будет ничего с этим URL-адресом. Например:

www.yoursite.com/images/v1/logo.png 

становится

www.yoursite.com/images/v2/logo.png 

раз изменения Logo.png в v2. Затем, на страницах, на которых ссылается логотип.png, у вас есть код для автоматической записи правильного URL-адреса на странице. Таким образом, каждая ревизия файла имеет уникальное имя и, следовательно, никогда не конфликтует с какими-либо ранее кэшированными версиями.

+0

Спасибо за помощь. Я позволю тебе знать, что я делаю. – 2009-11-20 08:30:16

0

Я считаю, что единственный способ сделать это - играть с заголовками HTTP.

Я вижу два варианта:

  1. Добавить заголовки в файл. Я не очень хорошо знаю IIS, но думаю, что у них есть такие возможности;
  2. Заменить изображение с помощью скрипта (PHP или C#), добавлять заголовки вручную в коде и отправить изображение
0

IIS должны быть установка последнего изменения заголовка и/или ETag на основе сам файл, поэтому, если он все еще кэшируется, возможно, что браузер плохо себя ведет, и в этом случае вы хотели бы установить прагму No-Cache. Литература: Microsoft KB reference, Section 14.9 of the HTTP1.1 spec

Решение Elalfer 2, вероятно, достигнет прагмы No-Cache в качестве побочного продукта.

1

У меня была такая же проблема, и нашел это решение:

$randy = md5(uniqid (rand(), 1)); 

затем сделать свой образ как:

$profile_img = "<img src='$imageLocation2?$randy' border='0'/>"; 

echo $profile_img; 

Это ставит случайную строку в конец файла JPG, как 3984289040823 так источник будет выглядеть примерно так:

<img src="example.jpg?3984289040823" /> 

Теперь каждый раз, когда вы загружаете браузер страниц, это новое изображение и загружает его.

Смежные вопросы