Max Brown
Guest
ПОЛНАЯ имитация рисунка png средствами PHP
Доброе утро, All!
Пытаюсь заставить клиентский браузер закэшировать сгенерированный скриптом рисунок и больше его не запрашивать..
Судя по логам, мне это не удаётся:
83.166.100.19 - - [13/Nov/2005:07:05:26 +0300] "GET /vote/0.png HTTP/1.0" 304 -
83.166.100.19 - - [13/Nov/2005:07:05:26 +0300] "GET /vote/png.png HTTP/1.0" 200 142
Здесь 0.png - обычный рисунок, а png.png создаётся скриптом через реврайт в .htaccess:
RewriteRule ^vote/png.png$ /vote/png.php [L]
Сам скрипт - вот:
<?
$h="Last-Modified: Sun, 13 Nov 2005 03:18:44 GMT\nETag: \"89b47-8e-4376b094\"\nAccept-Ranges: bytes\nContent-Length: 142\nConnection: close\nContent-Type: image/png\n\n";
$f=fopen("0.png", "rb");
$pn=fread($f, filesize("0.png"));
Header($h);
echo $pn;
exit;
?>
При имитации того же запроса методом GET выясняется, что после выданного скриптом заключительного заголовка Content-Type: image/png, сервер дописал ещё 3 своих:
[...]
Content-Type: image/png
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html
Попытка модифицировать скрипт:
Header($h.$pn); exit;
привела к тому, что в заголовок вставилось только начало png-шника, после чего сервер опять-таки выдал 3 своих заголовка.
Вывод: "WRONG WAY!!!"
Ok, подскажите тогда пожалуйста правильный способ.
-~{}~ 13.11.05 07:44:
P.S. А вот стандартный способ почему-то, кажется, сработал несмотря на chunked:
<?
$h="Content-Type: image/png\nLast-Modified: Sun, 13 Nov 2005 03:18:44 GMT\nETag: \"89b47-8e-4376b094\"\n";
Header($h);
$image = ImageCreate(10, 10);
$magenta = ImagecolorAllocate($image, 204, 51, 102);
ImageFill($image, 1, 1, $magenta);
ImagePNG($image);
ImageDestroy($image);
?>
И всё равно, не понимаю, как отменить выдачу в Transfer-Encoding: chunked - уж сколько она мне крови попортила! Мбть, подскажете?
-~{}~ 13.11.05 07:46:
P.P.S. Т.е., задача-максимум, сделать неотличимую от обычного рисунка выдачу - так и не решена :-(
Доброе утро, All!
Пытаюсь заставить клиентский браузер закэшировать сгенерированный скриптом рисунок и больше его не запрашивать..
Судя по логам, мне это не удаётся:
83.166.100.19 - - [13/Nov/2005:07:05:26 +0300] "GET /vote/0.png HTTP/1.0" 304 -
83.166.100.19 - - [13/Nov/2005:07:05:26 +0300] "GET /vote/png.png HTTP/1.0" 200 142
Здесь 0.png - обычный рисунок, а png.png создаётся скриптом через реврайт в .htaccess:
RewriteRule ^vote/png.png$ /vote/png.php [L]
Сам скрипт - вот:
<?
$h="Last-Modified: Sun, 13 Nov 2005 03:18:44 GMT\nETag: \"89b47-8e-4376b094\"\nAccept-Ranges: bytes\nContent-Length: 142\nConnection: close\nContent-Type: image/png\n\n";
$f=fopen("0.png", "rb");
$pn=fread($f, filesize("0.png"));
Header($h);
echo $pn;
exit;
?>
При имитации того же запроса методом GET выясняется, что после выданного скриптом заключительного заголовка Content-Type: image/png, сервер дописал ещё 3 своих:
[...]
Content-Type: image/png
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html
Попытка модифицировать скрипт:
Header($h.$pn); exit;
привела к тому, что в заголовок вставилось только начало png-шника, после чего сервер опять-таки выдал 3 своих заголовка.
Вывод: "WRONG WAY!!!"
Ok, подскажите тогда пожалуйста правильный способ.
-~{}~ 13.11.05 07:44:
P.S. А вот стандартный способ почему-то, кажется, сработал несмотря на chunked:
<?
$h="Content-Type: image/png\nLast-Modified: Sun, 13 Nov 2005 03:18:44 GMT\nETag: \"89b47-8e-4376b094\"\n";
Header($h);
$image = ImageCreate(10, 10);
$magenta = ImagecolorAllocate($image, 204, 51, 102);
ImageFill($image, 1, 1, $magenta);
ImagePNG($image);
ImageDestroy($image);
?>
И всё равно, не понимаю, как отменить выдачу в Transfer-Encoding: chunked - уж сколько она мне крови попортила! Мбть, подскажете?
-~{}~ 13.11.05 07:46:
P.P.S. Т.е., задача-максимум, сделать неотличимую от обычного рисунка выдачу - так и не решена :-(