В PHP вам нужно либо использовать функции multibyte , либо включить mbstring.func_overload . Таким образом, такие вещи, как strlen, будут работать, если у вас есть символы, которые принимают более одного байта.
Вам также потребуется определить набор символов ваших ответов. Вы можете использовать AddDefaultCharset, как указано выше, или написать PHP-код, который возвращает заголовок. (Или вы можете добавить тег META в свои HTML-документы.)
Армин Роначер имеет правильную идею. Проблема состоит в случайных цепочках. Я бы использовал:
<img src="picture.jpg?1222259157.415" alt="">
, где «1222259157.415» - текущее время на сервере. (Примечание: я использовал python time.time (), чтобы сгенерировать это)
Вы можете написать прокси-скрипт для работы с изображениями - это немного больше работы. Что-то нравится в этом:
HTML:
<img src="image.php?img=imageFile.jpg&some-random-number-262376" />
Сценарий:
// PHP
if( isset( $_GET['img'] ) && is_file( IMG_PATH . $_GET['img'] ) ) {
// read contents
$f = open( IMG_PATH . $_GET['img'] );
$img = $f.read();
$f.close();
// no-cache headers - complete set
// these copied from [php.net/header][1], tested myself - works
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Some time in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
// image related headers
header('Accept-Ranges: bytes');
header('Content-Length: '.strlen( $img )); // How many bytes we're going to send
header('Content-Type: image/jpeg'); // or image/png etc
// actual image
echo $img;
exit();
}
На самом деле, либо заголовки no-cache, либо случайное число на изображении src должны быть достаточными , но так как мы хотим быть пуленепробиваемыми.
С моей точки зрения, отключить кеширование изображений - плохая идея. Вообще.
Проблема с корнем заключается в том, как заставить браузер обновлять изображение, когда он был обновлен на стороне сервера.
Опять же, с моей личной точки зрения, лучшим решением является отключить прямой доступ к изображениям. Вместо этого обращайтесь к изображениям через серверный фильтр / сервлет / другие подобные инструменты / службы.
В моем случае это служба отдыха, которая возвращает изображение и прикрепляет ETag в ответ. Служба сохраняет хэш всех файлов, если файл изменен, хеш обновляется. Он отлично работает во всех современных браузерах. Да, для его реализации требуется время, но это того стоит.
Единственное исключение - это значки. По некоторым причинам это не работает. Я не мог заставить браузер обновлять кеш с сервера. ETags, Cache Control, Expires, заголовки Pragma, ничего не помогли.
В этом случае добавление некоторого параметра random / version в url, кажется, является единственным решением.
При загрузке изображения его имя файла не сохраняется в базе данных.
blockquote>Изменить это, и вы исправили свою проблему. Я использую временные метки, такие как предлагаемые выше решения: Image- & lt; timestamp> .jpg
Предположительно, любые проблемы, которые вы избегаете, сохраняя одинаковое имя файла для изображения, можно преодолеть, скажите, что они собой представляют.
use Class = "NO-CACHE"
sample html:
<div>
<img class="NO-CACHE" src="images/img1.jpg" />
<img class="NO-CACHE" src="images/imgLogo.jpg" />
</div>
jQuery:
$(document).ready(function ()
{
$('.NO-CACHE').attr('src',function () { return $(this).attr('src') + "?a=" + Math.random() });
});
javascript:
var nods = document.getElementsByClassName('NO-CACHE');
for (var i = 0; i < nods.length; i++)
{
nods[i].attributes['src'].value += "?a=" + Math.random();
}
Результат: src = "images / img1.jpg" => src = "images / img1.jpg? a = 0.08749723793963926"
Простое исправление: Прикрепить случайную строку запроса к изображению:
<img src="foo.cgi?random=323527528432525.24234" alt="">
Что говорит HTTP RFC:
Cache-Control: no-cache
Но это не так хорошо работает: ) [/ д2]
Я использую функцию изменения времени файла PHP , например:
echo <img src='Images/image.png?" . filemtime('Images/image.png') . "' />";
Если вы меняете изображение, вместо этого используется новое изображение, а не кешированное, из-за с другой измененной меткой времени.
Добавить метку времени <img src="picture.jpg?t=<?php echo time();?>">
всегда даст вашему файлу случайное число в конце и остановит его кеширование
Ваша проблема в том, что, несмотря на заголовок Expires:
, ваш браузер повторно использует свою копию в памяти в памяти с момента ее обновления, а не даже проверяет ее кеш.
У меня было очень похожая ситуация с загрузкой изображений продукта в бэкэнде администратора для хранилища, подобного сайту, и в моем случае я решил, что лучшим вариантом было использование javascript для принудительного обновления изображения без использования каких-либо методов изменения URL, которые другие люди уже упомянутый здесь. Вместо этого я поместил URL-адрес изображения в скрытый IFRAME, названный location.reload(true)
в окне IFRAME, а затем заменил мое изображение на странице. Это заставляет обновлять изображение не только на странице, на которой я нахожусь, но и на любых последующих страницах, которые я посещаю, - ни клиент, ни сервер не должны помнить какие-либо URL-запросы или параметры идентификатора фрагмента.
Я написал код для этого в моем ответе здесь .
Я предполагаю, что исходный вопрос касается изображений, сохраненных с некоторой текстовой информацией. Таким образом, если у вас есть доступ к текстовому контексту при генерации src = ... url, рассмотрите использование / использование CRC32 байтов изображения вместо бессмысленной случайной или временной отметки. Затем, если страница с большим количеством изображений отображается, обновляются только обновленные изображения. В конце концов, если сохранение CRC невозможно, оно может быть вычислено и добавлено к URL-адресу во время выполнения.
Я - новый кодер, но вот что я придумал, чтобы остановить браузер от кеширования и удерживать его в просмотрах веб-камеры:
<meta Http-Equiv="Cache" content="no-cache">
<meta Http-Equiv="Pragma-Control" content="no-cache">
<meta Http-Equiv="Cache-directive" Content="no-cache">
<meta Http-Equiv="Pragma-directive" Content="no-cache">
<meta Http-Equiv="Cache-Control" Content="no-cache">
<meta Http-Equiv="Pragma" Content="no-cache">
<meta Http-Equiv="Expires" Content="0">
<meta Http-Equiv="Pragma-directive: no-cache">
<meta Http-Equiv="Cache-directive: no-cache">
Не знаете, что работает над тем, что браузер, но он работает для некоторых: IE: работает, когда веб-страница обновляется, и когда веб-сайт пересматривается (без обновления). CHROME: Работает только при обновлении веб-страницы (даже после повторного просмотра). SAFARI и iPad: не работает, мне нужно очистить History & amp; Веб-данные.
Любые идеи на SAFARI / iPad?
Я проверил все ответы по сети, и лучший из них, казалось, был: (на самом деле это не так)
<img src="image.png?cache=none">
.
Однако, если вы add cache = none параметр (который является статическим «ничьим» словом), это ничего не влияет, браузер все еще загружается из кеша.
Решение этой проблемы:
<img src="image.png?nocache=<?php echo time(); ?>">
, где вы в основном добавляете временную метку unix, чтобы сделать параметр динамическим и без кеша, он работал.
Однако моя проблема была немного иной: я загружал на лету сгенерированное изображение диаграммы php и контролировал страницу с параметрами $ _GET. Я хотел, чтобы изображение читалось из кеша, когда параметр URL GET остается прежним и не кэшируется при изменении параметров GET.
Чтобы решить эту проблему, мне нужно было хеш $ _GET, но поскольку это массив здесь - это решение:
$chart_hash = md5(implode('-', $_GET));
echo "<img src='/images/mychart.png?hash=$chart_hash'>";
Edit:
Хотя вышеупомянутое решение работает нормально, иногда вы хотите обслуживать кешированную версию UNTIL, файл изменен. (с приведенным выше решением, он полностью отключает кеш для этого изображения) Таким образом, для обслуживания кэшированного изображения из браузера UNTIL есть изменение в использовании файла изображения:
echo "<img src='/images/mychart.png?hash=" . filemtime('mychart.png') . "'>";
filemtime () получает время изменения файла.
blockquote>
Потенциал для плохого поведения прозрачных прокси-серверов между вами и клиентом, единственный способ полностью гарантировать, что изображения не будут кэшироваться, - это дать им уникальный uri, что-то вроде пометки timestamp как строки запроса или как часть пути.
Если эта временная метка соответствует последнему времени обновления изображения, тогда вы можете кэшировать, когда вам нужно, и подавать новое изображение в нужное время.
Я бы использовал:
<img src="picture.jpg?20130910043254">
, где «20130910043254» - время модификации файла.
При загрузке изображения его имя файла не сохраняется базы данных. Он переименован в Image.jpg (просто для использования при его использовании). При замене существующего изображения на новое имя также не изменяется. Просто содержимое файла изображения меняется.
blockquote>Я думаю, что есть два типа простых решений: 1) те, которые приходят на ум сначала (простые решения, потому что их легко придумать ), 2) те, которые вы в конечном итоге после размышления над (потому что они просты в использовании). По-видимому, вы не всегда будете в выигрыше, если захотите подумать. Но, по-моему, другие варианты довольно недооцениваются. Подумайте, почему
php
так популярен;)