PHP: Как заставить браузер извлекать изображение непосредственно с сервера при каждой загрузке страницы? - PullRequest
1 голос
/ 04 августа 2011

По сути, у меня есть страница, где пользователи могут загружать свои фотографии профиля.Однако, если они заменяют свой текущий, после того, как новый перезаписывает старый, старый все еще появляется после перезагрузки страницы, потому что, вероятно, потому что старый кэшируется.

В PHP я попытался использовать:

header("Cache-Control: no-cache, must-revalidate");
header("Expires: -1");

Но это не работает (по крайней мере) в Google Chrome.

Любые идеи, которые я могу сделать, чтобы при перезагрузке страницы после загрузки фото она вызвалабраузер всегда тянет файл с сервера, чтобы он тянул последний?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 04 августа 2011

Я бы посоветовал вам добавить какой-нибудь $_GET -параметр к URL-адресу изображения, например:

profile_user{user_id}.(jpg|png)?v={date('Ymdhis)} (Примечание: псевдо)

Структура выше w может привести к следующей ссылке:

profile_user001.png?v=20110804191700

Новая ссылка = браузер должен получить новое изображение = победа.

1 голос
/ 04 августа 2011

Пока вы заботитесь об управлении кешем с помощью заголовков HTTP, вы должны посмотреть, использует ли клиент HTTP 1.1 или HTTP 1.0, а также есть ли прокси между ними или нет.

Чтобы вообще указать, что ресурс не должен кэшироваться, вы можете рассмотреть следующие заголовки:

header("Pragma: no-cache"); # HTTP 1.0
header("Cache-Control: no-cache"); # HTTP 1.1
header("Expires: Thu, 01 Dec 1994 16:00:00 GMT");
 # With the two above, the last is not strictly necessary. Prefer a HTTP date in 
 # the past instead of -1 -OR- prefer 0 as it is specified how to deal with it.

Что можно кэшировать и как, см. Раздел 13.4 Кэшируемость ответов , а конкретные заголовки см. Протокол передачи гипертекста - HTTP / 1.1 Раздел 14 Определения полей заголовка .

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

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

В случае, если запрашивается старая ревизия, вы должны перенаправить на последнюю ревизию. Ответы на перенаправление чаще всего не кэшируются.

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

1 голос
/ 04 августа 2011

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

Стандартная практика - использовать новое имя файла, если изображение заменяется, или хотя бы добавить некоторыевид версии к своему названию.например, image.jpg? v = xxx.

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