Как кеширование в браузере обрабатывает изображения с горячей ссылкой + 204 ответа?

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

<img src="externalserver.com/catpic.png">
  1. При условии, что у всех соответствующих сторон включено кэширование в браузере, будет ли это изображение кэшироваться (также можно ли кэшировать изображения с внешних сайтов)?
  2. Если внешний сервер решит обслуживать другой образ в том же месте файла, скажем, с перезаписью.htaccess, будет ли поврежден кеш?
  3. Если внешний сервер решает обслуживать одно и то же изображение с?randomquerystring после этого кеш будет сломан?
  4. Если внешний сервер отправляет HTTP-код состояния 204 вместо фактической передачи изображения, что происходит с кэшированием?

Спасибо! Счастливых вам праздников.

1 ответ

Решение

Все это зависит.

  1. Пользовательский агент может кэшировать изображения. Будет ли он кэшировать изображения, зависит от того, как установлен сервер Cache-Control или же Expires заголовок. Для получения дополнительной информации посмотрите страницу заголовка Cache-Control в MDN.
  2. Пользовательский агент может или не может получить новый ресурс. Это зависит от Cache-Control заголовок, Expires заголовок, является ли ресурс устаревшим, использует ли сервер валидатор и выполняет ли он слабую или сильную проверку. Для получения дополнительной информации посмотрите страницу условных запросов HTTP в MDN.
  3. Сервер не обслуживает ресурс с ?randomquerystring, Скорее, клиент может запросить ресурс с ?randomquerystring, ?randomquerystring называется кэш-бастером. Пользовательский агент выполнит новый запрос, но я слышал, что некоторые прокси могут игнорировать кеш-буфер этого типа и по-прежнему возвращать кешированный ответ.
  4. Пользовательский агент, вероятно, будет уважать Cache-Control а также Expires заголовки. Соответствующая выдержка из RFC 2616:

    Ответ, полученный с любым другим кодом состояния (например, коды состояния 302 и 307), НЕ ДОЛЖЕН возвращаться в ответе на последующий запрос, если только нет директив управления кэшем или другого заголовка (заголовков), которые явно разрешают это. Например, они включают следующее: заголовок Expires (раздел 14.21); директива "max-age", "s-maxage", "must- revalidate", "proxy-revalidate", "public" или "private" (раздел 14.9).

Более подробную информацию о HTTP-кэшировании в целом можно найти в статье Илья Григорик, HTTP-кэширование.

Другие вопросы по тегам