Почему Firefox не перезагружает изображения уже на странице? - PullRequest
4 голосов
/ 03 февраля 2010

Я только что прочитал эту статью: https://developer.mozilla.org/en/HTTP_Caching_FAQ

Есть поведение Firefox (и некоторые другие браузеры, я думаю), я бы хотел понять:

если я беру любую веб-страницу и пытаюсь вставить одно и то же изображение несколько раз в javascript, изображение загружается только ОДИН РАЗ, даже если я указываю все необходимые заголовки, чтобы сказать «никогда не использовать кеш» (см. статью)

Я знаю, что есть обходные пути (например, строки запроса addind до конца URL и т. Д.) но почему Firefox действует так, если я говорю, что изображение не должно кэшироваться, почему изображение все еще берется из кэша, когда я пытаюсь вставить его заново?

Плюс, какой кеш для этого используется? (Наверное это кеш памяти)

Является ли это поведение таким же для динамического включения, например? ОТВЕТ - НЕТ :) PS: я знаю, что вам интересно, ПОЧЕМУ мне нужно это сделать (добавление одного и того же изображения несколько раз и принудительная повторная загрузка, но так работает наше приложение)

спасибо


Хороший ответ: firefox будет хранить изображения для текущей загрузки страницы в кеше памяти, даже если вы укажете, что он не должен их кешировать.

Вы не можете изменить это поведение, но это странно, потому что это не то же самое для файлов javascript, например

Может кто-нибудь объяснить или дать ссылку на документ, описывающий, как РАБОТАЕТ кеш Firefox?

Ответы [ 4 ]

4 голосов
/ 03 февраля 2010

То, чем вы здесь занимаетесь, является лишь частью вопроса кеширования.

Вся идея встраивания изображений путем ссылки на них по URL-адресам состоит в том, что вы можете ссылаться на один и тот же URL-адрес несколько раз, и браузер загружает его только один раз.

То есть, если вы пишете HTML (скажем, index.html):

<img src="hello.jpg" />
<img src="hello.jpg" />

В этом случае браузер вызывает только 2 HTTP-запроса: один для index.html и второй для hello.jpg.

Здесь вам нужно «подделать», что изображения загружаются с разных URL-адресов. Для этого есть несколько методов.

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

<img src="hello.jpg?1" />
<img src="hello.jpg?2" />

Это приведет к тому, что браузер отправит один HTTP-запрос для получения каждого изображения: один для hello.jpg?1 и второй для hello.jpg?2. Однако некоторые веб-серверы / браузеры могут оптимизировать это и отправлять только один запрос, чтобы просто получить hello.jpg.

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

1 голос
/ 03 февраля 2010

Решение Jaakko должно работать в соответствии с вашими потребностями, если ваша серверная сторона с удовольствием справится с фиктивной частью запроса.

Это можно рассматривать как ошибку, поскольку вы можете утверждать, что FF действительно должен делать новый HTTP-запрос для каждого изображения. Соответствующее кэширование (на стороне клиента) может по-прежнему мешать этим запросам фактически попадать в сеть, где это не нужно. Фактический ответ на вопрос, является ли это поведение ошибкой или нет, должен быть в спецификации HTML, но я не знаю, поскольку не изучал ее.

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

Похоже, у вас есть URI, который выводит случайные / переменные ответы. Другой подход может заключаться в использовании одного URI, но оттуда с помощью перенаправлений 3xx с изменяющимся / случайным заголовком Location на другие доступные изображения. URI. Это также позволит вам кэшировать изображения, которые вы выводите, что вы не сможете сделать, если у вас есть один URI, который постоянно меняется.

GET / изображение / случайное
- 303 см. Другие
- Расположение: / image / xzkzkj3242hkjaha123

GET / image / random
- 303 см. Другие
- Местоположение: / image / xlso847iuewrqb1231

1 голос
/ 03 февраля 2010

Я полагаю, что кеширование относится только к загрузке страницы в другой раз, поэтому при повторной загрузке страницы изображения не загружаются снова, когда они были кэшированы. Но поскольку загружено одиночное изображение (на которое ссылается одиночный URL), на него не влияет флаг «никогда не использовать кеш» на одной странице -load.

Используя PHP, я бы пошел со скриптом, например image.php, который принимает хеш (просто случайный код) в качестве параметра, но выдает только одно и то же изображение снова и снова, в то время как браузер все время интерпретирует изображение как другое.

Так что image.php?id=asdf и image.php?id=qwer будут загружать одно и то же изображение, но в браузере будут выглядеть как разные изображения и будут загружаться отдельно.

0 голосов
/ 20 апреля 2010

Для меня не странно кэшировать изображения в одном запросе и использовать кэшированную версию во время рендеринга страницы. Но я заметил еще одно поведение в моем приложении, которое очень нежелательно. У меня есть полностью ajaxed приложение и в следующем потоке ajax:

  1. У меня есть некоторые http://url/image.jpg, отображаемые на странице
  2. Я загружаю новое изображение из пользовательского интерфейса, заменяя image.jpg. URL остается прежним - http://url/image.jpg - но изображение меняется. Все это делается в ajax-запросе, и простой GET не выполняется
  3. Firefox показывает старый image.jpg.

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

Это ИМХО можно считать ошибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...