Обновить изображение или очистить кеш - PullRequest
1 голос
/ 17 февраля 2011

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

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

Боюсь, это невозможно, но я прошу здесь просто быть уверенным.

обновление: я использую nginx и PHP на стороне сервера

Ответы [ 2 ]

4 голосов
/ 17 февраля 2011

Вы можете использовать ETAGs на своих миниатюрах.Это предотвратит передачу фактических данных миниатюр, если они не изменились (то есть все еще имеют тот же хеш).Тем не менее, вы все равно будете сталкиваться с HTTP-запросами клиентов, чтобы проверить, изменился ли ETAG (обычно на HTTP 304.

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

Редактировать: Добавить альтернативу из моего другого комментария.

Альтернативой может быть использование дополнительных параметров запроса для принудительного повторного извлечениякогда ресурс изменился, как предложено в другом ответе. Вариантом этой схемы (которая используется многими приложениями Rails) является добавление метки времени последнего изменения (или некоторого вида хэша) в качестве параметра к файлу, который изменяется только тогда, когдафайл на самом деле меняется. Как-то так, илиодин из вышеперечисленных методов, фактически единственный способ быть уверенным в том, что у вас не будет ненужных запросов проверки кэша, при этом всегда имея самый свежий ресурс.

0 голосов
/ 17 февраля 2011

Добавьте в конце имени файла параметр get, например:

example.jpg?refresh=yesplease

Вы также можете обновлять это изображение при каждом посещении, используя параметр rand (). В php:

example.jpg?refresh=<?php echo rand(1,999); ?>
...