пятница, декабря 01, 2006

Популярная механика: битва с кэшем

Работая над сайтом, столкнулся с неприятным поведением интернета от «Дальсвязи»: хоть тресни, но картинки где-то у них тихо кэшируются — и намертво. Заказчик обновляет через веб-интерфейс фотографию к разделу сайта — а видит старую, и моё честное слово, что фото там новое, и весь мир (кроме клиентов «Дальсвязи») уже видит новый вариант — это слово мало его убеждает.

Вот такой странный и вредный прокси где-то у них стоит. Обновления текстов он ловит нормально, а фотографии в нём застревают, как мухи в сиропе. Всевозможные заголовки, запрещающие кэширование, не помогают: они относятся к странице, а на фотки прокси их действие не распространяет.

Пришлось плюнуть и написать:

<?php
if (strlen($_SERVER['QUERY_STRING'])<12){ $jpeg=$_SERVER['QUERY_STRING'].".jpg";
// $ROOT надо сперва определить
$jpegpath=$ROOT."/data/".$jpeg;
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/jpeg\n");
header("Content-transfer-encoding: binary\n");
header("Content-length: " . filesize($jpegpath) . "\n");
$fp = fopen( $jpegpath, "r" );
fpassthru( $fp );
fclose($fp);
}
?>


Этот скрипт, будучи сохранён под именем jpeg.php, берёт строку запроса, приставляет к ней ".jpg", ищет в указанном каталоге файл с получившимся именем и отправляет его клиенту как JPEG, предварительно выставив всяческие запреты на кэширование.

Знаете, сработало.

Единственное, что в реальной жизни вместо смешного ограничения на 12 знаков в строке запроса, надо эту строку более жёстко фильтровать. Потому что выдавать с сервера файлы по произвольному вводу клиента — отвратительная идея. Но речь-то сейчас шла не о хакерах, а о том, как победить непокорный кэш у провайдера.

2 комментария:

Анонимный комментирует...

А что за браузер?
Сталкивался с такой проблемой, но винил в этом кэш своего браузера. В моем случае Firefox. Помогало Ctrl+F5 (обновление минуя кэш обозревателя).
Поставил версию по-свежее, проблема исчезла

Сергей комментирует...

У них IE, а возможно, и что-нибудь ещё. IE есть точно.

Я грешу на прокси, потому что у них сисадмин самолично вычистил кэш браузера, но это не помогло, т. е кэширование где-то раньше происходило — вероятнее всего, у провайдера.

У меня всё было гладко, но кого за это благодарить — моего провайдера (не «Дальсвязь») или тот же Firefox — неясно.

Поиск по этому блогу