Сайт: www.lu4ick.ru Ещё два дня назад всё было замечательно, но со вчерашнего дня картинки пароля на странице перестали изменяться пока не сбросишь кеш в браузере насильно (картинка в разделе "связаться"). А если обратиться на прямую, то всё замечательно: http://lu4ick.ru/code/my_codegen.php. Подскажите как побороть проблему...спасибо!
У меня всё норм, хром Под другими браузерами может быть, достаточно впихнуть рандомный айди в get параметры урла картинки чтобы было например так Код (Text): <img class="" src="code/my_codegen.php?r=85423742423">
заголовки ответа: Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Connection:Keep-Alive Content-Type:image/png Date:Thu, 28 Feb 2013 06:09:25 GMT Expires:Mon, 26 Jul 1997 05:00:00 GMT Keep-Alive:timeout=5, max=97 Last-Modified:Thu, 01 Jan 1970 02:46:40 GMT Pragma:no-cache Server:Apache/2.2.23 (FreeBSD) PHP/5.4.11 mod_ssl/2.2.23 OpenSSL/0.9.8x DAV/2 Transfer-Encoding:chunked X-Powered-ByHP/5.4.11 выделенного набора вполне достаточно чтоб изображение НЕ попадало в кэш. к примеру у меня оно в кэш так и не попало ни разу. возможно, у вас некорректные настройки браузера и/или прокси-сервера.
Я обратился сначала к хостеру и у него такая же проблема, а значит Вам скорее повезло! Все строчки, что Ganzal посоветовал в самое начало страницы добавил, но так и не помогло... siiXth, если я так сделаю, то это же не на долго спасёт ситуацию или ошибаюсь?
вообще-то ничего не надо добавлять - ваш скрипт и так этими строками отвечает браузеру. я вам их привел чтоб вы ничего не меняли в коде - код рабочий. почему возникают проблемы с кэшированием - надо искать между сервером и клиентом
Так вот если бы всё было так просто я бы и не писал сюда, но всё что знал уже перепробовал... Прошу теперь помощи от более знающих товарищей. Проверено уже на 4 компах - у них тоже код не меняется, а на прямую при обращении к картинке всё замечательно...
это железный вариант по сути данный гет должен быть связан с кодом на картинке, к нему посылается хеш, он выдаёт по этому хешу определённую картинку, всё это на хешах и токенах, но я не знаю какая у вас реализация. гет параметр даёт записывать в кеш картинку по каждому гету, но так как там рандом или связь - картинка при каждой загрузке будет с новым гетом качаться с сервера так как её не будет в кеше. а про засорение кеша думать не стоит - современные браузеры давно его чистят периодически даже не обращая внимания на заголовки, да и в кеше у любого юзера и так полно дряни. Добавлено спустя 1 минуту 29 секунд: вы не представляете какую херню я наблюдал у людей под палёными браузерами. дайте полную справку о браузерах на каких есть такая трабла.
Код такой: Код (Text): <?php $DOCUMENT_ROOT = $_SERVER["DOCUMENT_ROOT"]; define("code_dir", "my_codegen/"); function generate_code() { $hours = date("H"); $mouns = date("m"); $year_day = date("z"); $minuts = substr(date("H"),0,1); $str = $hours . $mouns . $year_day . $minuts; $str = md5(md5($str)); $str = strrev($str); $str = substr($str, 2, 5); $array_mix = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY); srand ((float)microtime()*1000000); shuffle ($array_mix); return implode("", $array_mix); } function img_code() { header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s", 10000) . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); header("Content-Type:image/png"); $linenum = 2; $img_arr = array( "codegen.png", "codegen0.png" ); $font_arr = array(); $font_arr[0]["fname"] = "verdana.ttf"; $font_arr[0]["size"] = 16; $font_arr[1]["fname"] = "times.ttf"; $font_arr[1]["size"] = 16; $n = rand(0,sizeof($font_arr)-1); $img_fn = $img_arr[rand(0, sizeof($img_arr)-1)]; $im = imagecreatefrompng (code_dir . $img_fn); for ($i=0; $i<$linenum; $i++) { $color = imagecolorallocate($im, rand(0, 150), rand(0, 100), rand(0, 150)); imageline($im, rand(0, 20), rand(1, 50), rand(150, 180), rand(1, 50), $color); } $color = imagecolorallocate($im, rand(0, 200), 0, rand(0, 200)); imagettftext ($im, $font_arr[$n]["size"], rand(-4, 4), rand(10, 45), rand(20, 35), $color, code_dir.$font_arr[$n]["fname"], generate_code()); for ($i=0; $i<$linenum; $i++) { $color = imagecolorallocate($im, rand(0, 255), rand(0, 200), rand(0, 255)); imageline($im, rand(0, 20), rand(1, 50), rand(150, 180), rand(1, 50), $color); } ImagePNG ($im); ImageDestroy ($im); } img_code(); ?> И попробовал Ваш способ-он лишь раз изменил код и потом опять завис...браузеры все выдают одно и то же (мазила, опера, хром, осёл)! Добавлено спустя 45 секунд: попробовал уже...написал ответ выше!
да? с чего бы это? модификация 1970 год, протухает в 1997 году. вопрос от кэша - изменилось с 1970 года? какие-то кэши видят что протухло в 1997, а какие-то - что не изменилось с 1970. уберите эти 10000 и сервер будет подставлять свою дату и будет так: изменилось "сейчас", протухло 1997 следовательно кэшировать уже не нужно. повторный запрос: изменилось с "сейчас"? да, так как протухло еще в 1997. вообще вам реально проще не в механизме conditional-get разбираться а просто вставить рандомный токен в вызов скрипта.
- вот тут понять у меня знаний вообще не хватает уж извините! - значит вместо: Код (Text): header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s", 10000) . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); header("Content-Type:image/png"); я пишу: Код (Text): header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache"); header("Content-Type:image/png"); Правильно понял? Добавлено спустя 3 минуты 11 секунд: Самое интересное, что ещё позавчера всё работало же...
не, убрать надо только 10000 из header("Last-Modified: " . gmdate("D, d M Y H:i:s", 10000) . " GMT"); и еще есть http_date() которая возвращает строку в требуемом RFC-2616 формате. то есть header('Last-Modified: ' . http_date()); и все да ничего страшного. ветка же для новичков) вам уже написали как надо сделать - в сгенерированном HTML вызов картинки должен обрести вид:
я это сделал уже давно-не помогло!Я вообще не могу понять как это поможет, если цифры и буквы являются результатом динамического php кода! Пишу так: Код (Text): header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); 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"); header("Content-Type:image/png"); ? Добавлено спустя 6 минут 27 секунд: выдаёт ошибку: Код (Text): Call to undefined function http_date()
ну как бы интернет не первый год работает. есть стандарты по которым работают серверы и клиенты. когда вы не добавляете параметров то браузер будет стараться считать ресурс статическим и будет стремиться его кэшировать. если появляется GET-запрос - динамическим и закэшировать его можно будет только с соответствующими заголовками. POST-запрос вообще не кэшируется и всегда подтверждается. то что у вас генерируется - динамика, сопровождающаяся валидными заголовками, запрещающими кэширование. но по какой-то причине ваши 4 браузера продолжают хотеть кэшировать
После добавления ?r=85423742423 код меняется единожды и опять замирает. Такая ситуация у меня на работе, дома, у хостеров, у товарища, тем более буквально два дня назад всё было замечательно...ума не приложу, что можно сделать...
ну ты врунишка =) сделай сейчас ещё раз и давай я посмотрю, будет кешироваться или нет. Добавлено спустя 1 минуту 19 секунд: код должен быть КАЖДЫЙ РАЗ РАЗНЫЙ. тебе сказали сделай рандом. <img class="" src="code/my_codegen.php?r=<?php echo rand(0,999999);?>">
Код (Text): Request URL:http://www.lu4ick.ru/code/my_codegen.php?r=%3C?php%20echo%20rand(0,999999);?%3E отлично, чо)
а ты понимаешь вообще что тут написано: <img class="" src="code/my_codegen.php?r=<?php echo rand(0,999999);?>">
да вообще этого вполне будет достаточно. но. у вас на странице иногда не одна капча а несколько. пока будет отдаваться последняя - первая уже будет невалидна. тут много чего придется переписать...