изображение через скрипт. Кеширование

Дед Анвирыч

Новичок
изображение через скрипт. Кеширование

Уважаемые!

Отдаю изображение скриптом. Т.к. относительно часто изображения менятся не будут, хотел бы чтоб у пользователя они кешировались. Поступил так -
PHP:
$im = imagecreatefromjpeg($filename);

header("Last-Modified: " . gmdate("D, d M Y H:i:s", fileatime($filename)) . " GMT");
header ("Content-type: image/jpeg");
imagejpeg ($im);
imagedestroy ($im);
Но чето не заметил чтоб это помогло.
какие заголовки еще нужно отправить?
 

Дед Анвирыч

Новичок
я отдаю файл скриптом, потомучто файлы лежат вне htdocs
нужно чтобы они не были доступны с www
 

Фанат

oncle terrible
Команда форума
эти две задачи противоречат друг другу. если ты скрываешь файл от кого-то, то и кэшировать его не надо
и зачем тогда ты делаешь imagecreatefromjpeg?
 

Дед Анвирыч

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

а как его тогда кроме как imagecreatefromjpeg отдать?
 

alexhemp

Новичок
Дед Анвирыч

Обрабатывай If-Modified-Since по стандарту. Браузеры в настройках кэширования "по умолчанию" используют его при повторном запросе страницы.

Проверять просто - смотришь обмен запросами браузера и сервера для данного запроса.
 

xionik

Новичок
Дед Анвирыч а делать выборку на показ фотки, только тем, кто её родимую и заливал на сервак слабо?
 

ForJest

- свежая кровь
Дед Анвирыч
Да, извини - я невнимательно посмотрел тот топик.
Вообще браузеры по-моему посылают HEAD request для контента. Если он не модифицировался - то нужно ответить правильно.
http://phpfaq.ru/na_tanke#headers
тебе поможет

-~{}~ 05.09.05 00:32:

Короче сразу отдаёшь Last Modiied а потом обрабатываешь
If-Modified-Since:

Код:
GET /img/goat-hiring.png HTTP/1.1
Accept: */*
Accept-Language: ru
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: stat.livejournal.com
Connection: Keep-Alive
Cache-Control: no-cache

HTTP/1.1 200 OK
Connection: close
Date: Sun, 04 Sep 2005 21:30:48 GMT
Server: Perlbal
Last-Modified: Mon, 23 May 2005 22:08:08 GMT
Content-Type: image/png
Content-Length: 9440

GET /img/goat-hiring.png HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-icq, */*
Accept-Language: ru
Accept-Encoding: gzip, deflate
[b]If-Modified-Since[/b]: Mon, 23 May 2005 22:08:08 GMT
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: stat.livejournal.com
Connection: Keep-Alive

HTTP/1.1 304 Not Modified
Connection: close
Date: Sun, 04 Sep 2005 21:30:02 GMT
Server: Perlbal
Last-Modified: Mon, 23 May 2005 22:08:08 GMT
 

Дед Анвирыч

Новичок
Фанат, да пожалуй ты прав, я стормозил ;)
xionik, этот скрипт выполняет как раз такую задачу - берет из сессии id пользователя, в зависимости от этого id выбирает папку ну и тд. Или ты думаешь что если положить все фотки в доступный с www каталог никто не догадается попробывать получить доступ к чужим фоткам?

ForJest, ага. щаз попробую
пасиб
 

xionik

Новичок
Дед Анвирыч знаешь, я стараюсь думать. Что бы сильно хитрые парни не смогли взять все фотки из чужого каталога есть несколько методов. Но я тебе покажу только один:
PHP:
Index.php
<?php
    $dirname = '/files/';
    $filename = $dirname."jedit42install.exe";
    $fp = fopen($_SERVER['DOCUMENT_ROOT'].$filename, "r");

    header("Content-Type: application/octet-stream;");
    header('Content-disposition: attachment; filename="'.basename($filename).'"');

    fpassthru($fp);
    fclose($fp);
?>

.htaccess
<Files "*.*">
Order allow,deny
Deny from all
</Files>
 

Дед Анвирыч

Новичок
xionik, Ну и что это меняет? :) всё абсолютно тоже самое.


ForJest? чето никак я этот заголовок отловить не могу. Взял хедеры через apache_request_headers():
Код:
ie:
    [Accept] => */*
    [Referer] => ...
    [Accept-Language] => ...
    [User-Agent] => ...
    [Host] => ...
    [Connection] => Keep-Alive
    [Cookie] => PHPSESSID=....

firefox:
    [Host] => ...
    [User-Agent] => ...
    [Accept] => image/png,*/*;q=0.5
    [Accept-Language] => ...
    [Accept-Charset] => ...
    [Keep-Alive] => 300
    [Connection] => Keep-Alive
    [Referer] => ...
    [Cookie] => PHPSESSID=...
    [Cache-Control] => max-age=0
Никакого чебурашки здесь нет (с) Крокодил Гена :)

или входящие хедеры можно как то еще отловить?
 

ForJest

- свежая кровь
Дед Анвирыч
У тебя включены сессии? При включенной сессии автоматически посылаеются хидеры, запрещающие кэширование.
Сходи http://phpfaq.ru/na_tanke#headers и поставь плуги и посмотри обмен заголовками - так тебе всё станет ясно.

-~{}~ 05.09.05 01:16:

К тому же браузер посылает запрос только на ВТОРОЙ раз. Приведённый лог это показывает.
Т.к. сначала он получает Last Modified, потом кэширует файл, потом его отсылает в следующем запросе и сервер уже отвечает 304.
 

Дед Анвирыч

Новичок
Включены... блин... засада...
да плуги стоят, в броузеер все смотрю, че толку то...

т.е. если посылаются куки - то никакого кеширования? правильно?

-~{}~ 05.09.05 02:22:

да я 10 раз обновлял старницу. ни во второй ни в десятый...
 

ForJest

- свежая кровь
Дед Анвирыч
http://stat.livejournal.com/img/goat-hiring.png
Посмотри заголовки там и сравни со своими.
Если выводятся заголовки ЗАПРЕЩАЮЩИЕ кэширование (что бывает, если включены сессии) то конечно же никакого кеширования не будет. Нужно отключить сессии в этом скрипте.
 

Дед Анвирыч

Новичок
Нельзя отключать сессии в этом скрипте. откуда тогда id юзера брать? из get чтоли :D
Ладно, суть проблемы ясна, спасибо
 
Сверху