если будет скажем images/1.jpg которое будет на самом деле show.php?id=1 то браузер будет оставлять у себя в кеше при запросе этой картинки он будет спрашивать типа не изменилась ли она с такого-то момента. если нет - выдаешь в ответ 304 заголовок и браузер показывает картинку из кеша, иначе обновляешь картинку в браузерном кеше
хедер посылаю такой: Код (Text): header("Content-Type: image/jpeg"); header("Cache-control: private"); header("Cache-control: max-age=999999999999"); ссылка выглядит так: show_image/8/ но кеширует картинки только фаерфокс. Опера и ИЕ нет! Чё ещё сделать?
Неужели давать прямой доступ к папке с картинками? в смысле производительности это даже лучше, но они у меня хранятся без расширения, просто номерок. Это надо будет переписывать ещё сохранение файла... Может, есть ещё какой хедер?
Правду говорить Надо: 1. Выдавать Last-Modified при запросе 2. При запросе анализировать заголовки на предемет If-Modified-Since и отвечать на него 3. Можно еще E-Tag юзать в паре с If-None-Match. Подробно писать неохота (информации в инете очень много)…
попробуй еще добавить такое дело PHP: <? $Tag = md5($id); // или как там у тебя передается id картинки if(isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $Tag) header('HTTP/1.0 304 Not Modified' ); // повторный запрос - скажем что не изменено //первый запрос header("Content-Type: image/jpeg"); header("Cache-Control: max-age=2592000"); // на 30 дней header("ETag: ".$Tag); header('Content-type: image/jpeg'); // выводи свою пикчу ?>
PHP: <?php $last_modified=gmdate("D, d M Y H:i:s", filemtime($path)); $expires=gmdate("D, d M Y H:i:s", gmmktime( 1, 1, 1, 1, 1, 2020)); //die("Expires: {$expires} <br>Last-Modified: {$last_modified}"); $Tag = md5($ID); // if(isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] == $Tag) { // повторный запрос - скажем что не изменено header('HTTP/1.0 304 Not Modified' ); } header("Cache-control: private"); header("Cache-control: max-age=999999999999"); header("Expires: " . $expires); header("Last-Modified: " . $last_modified); header("ETag: ".$Tag); header("Content-Type: image/jpeg"); ?> Так тоже не помогает :x Может как-то проследить хедеры, которые апач выкидывает при выдаче картинки, как это сделать?
Наверно легче просто давать ссылку на картинку с диска, но с этим проблемы, так как мод реврайт любой запрос на сайт переадресует в скрипт... Как сделать исключения?
лично я не пользуюсь передачей инфы о последней модификации файла у меня Код (Text): $Tag = md5($FILE_PATH.filemtime($FILE_PATH)); поэтому картинку рекешируют автоматом при ее изменении (ведь меняется значение тага)... вернее было не автоматом пока я не задал такой вопрос
PHP: <?php function show_just_image_v1() { global $uri_parser; $ID=(int)$uri_parser->get_level(1); $size=(int)$uri_parser->get_level(2); if($size>0) $ID=get_sized_image_ID_v1($ID, $size); $path=IMAGE_DIR.$ID; if(!file_exists($path)) die("Картинки {$ID} не найдено на сервере."); $Tag = md5($ID); // if(isset($_SERVER['HTTP_IF_NONE_MATCH'])) { if($_SERVER['HTTP_IF_NONE_MATCH'] == $Tag) { header('HTTP/1.0 304 Not Modified' ); exit(); } } if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { $browser_date=$_SERVER['HTTP_IF_MODIFIED_SINCE']; if(str_date_to_int_v1($browser_date)>filemtime($path)) { header("HTTP/1.1 304 Not Modified"); exit(); } } $last_modified=gmdate("D, d M Y H:i:s", filemtime($path)) . " GMT"; $expires=gmdate("D, d M Y H:i:s", gmmktime( 1, 1, 1, 1, 1, 2020)) . " GMT"; header("Cache-control: private"); header("Cache-control: max-age=999999999999"); header("Expires: " . $expires); header("Last-Modified: " . $last_modified); header("ETag: ".$Tag); header("Content-Type: image/jpeg"); $img=imagecreatefromstring(file_get_contents($path)); imagejpeg($img); exit(); } ?> Боюсь, что преждевременно, но похоже в осле это работает, а Опера всё равно перезагружает картинку.
metadon А есил оно у меня так Код (Text): RewriteEngine On RewriteRule ^([^.]+)$ index.php , то это будет так: Код (Text): RewriteEngine On RewriteRule ^([^.]+)$ index.php RewriteRule /images/ /img/$1 [QSA] Просто добавить строчку? А то я не понимаю
RewriteRule ^([^.]+)$ index.php - не советую так делать, очень не удобно и очень глобально, вот и теперь с картинками лажа, вот в DLE например в .htaccess очень много прописано и она не мешает ничему на сервере. RewriteEngine On RewriteRule /images/ /img/$1 [QSA] RewriteRule ^([^.]+)$ index.php попробуй но не проверял сработает иои нет так как глобально прописано
PHP: <?php if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { $browser_date=$_SERVER['HTTP_IF_MODIFIED_SINCE']; if(str_date_to_int_v1($browser_date)>filemtime($path)) { header("HTTP/1.1 304 Not Modified"); exit(); } } ?> Может тут дату файла конвертить в гринвич?
C попробуйте сюда позаходить картинка кешируется у меня оперой, лисичкой, ие, браузерами на кпк, смарте и PSP.... отпишитесь о результатах
а ты не добавлял? =) у меня изначально добавлено кстати вопрос хочется вопросить... то что я посылаю хедером контент image/jpeg а расширение файла не jpg|jpeg - никого не корежит? то есть если моя ссылка будет не на jpg заканчиваться а на gif, png, iso и прочее сочетание латинских символов это нормально со стороны браузера? или лучше подкорректировать?
Ganzal Я думаю что браузеру пофиг какое расширение главное чтоб указывался формат (image/jpeg), почти все капчи с расширением php и всё норм
У меня вопрос. На gamedev.ru меня раскритиковали за русские слова в url при фильтрации по тагам, так как они в браузерах кроме Оперы показываются плохо. Можно как-то сдедлать чтобы они показывались хорошо, или таги должны быть только на латинице?
Я за русские url, кривое отображение это проблемы браузеров, а не сайта. В IE и Опере рабоает, FF нет. С тегами, тоже, почему бы и не на русском? Как аргумент, достаточно крупный проект Википедия давно и успешно юзает русские url. +уже юзаюца домены на русском.
1. не таги, а тэги 2. я бы сказал, что они в браузерах кроме мозиллы показываются хорошо для неё, впрочем, есть исправляющее расширение.
Таги у меня будут на инглише, картинке будут прямо на диске. Мод реврайт я уже замастерил, уже умею почти в нём писать. Вот чё написал: Код (Text): RewriteEngine On RewriteCond %{REQUEST_URI} !show_image/\d+\.jpg$ RewriteCond %{REQUEST_URI} !style/.* RewriteRule .* index.php
C вообще тебе респект. думаю со мной согласятся и другие, но ты как минимум что-то делаешь, причем это видно.