В настоящее время я выводлю некоторые файлы изображений через PHP readfile (), используя следующий код, но через Firefox и инструменты разработчика Chrome я замечаю, что ни один из этих файлов не кэшируется.
ob_start();
outputfile($fp);
function outputfile( $fp ) {
header("Content-Type: $mime_type");
header("Content-Length: " . filesize($fp));
header("Cache-Control: public, max-age=3600");
header("Etag: " . md5_file($fp));
$date = gmdate("D, j M Y H:i:s", filemtime($fp))." GMT";
header("Last-Modified: $date");
readfile($fp);
exit; // tried ob_end_flush() too before exiting
}
Код выводитфайл со следующими заголовками в инструментах разработчика ...
Cache-Control: public, max-age=2678400
Connection: keep-alive
Content-Length: 155576
Content-Type: image/jpeg
Date: Mon, 21 May 2018 22:31:02 GMT
Last-Modified: Sat, 03 Mar 2018 19:34:05 GMT
Etag: 507f2520385c009a7385a1165032bd61
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Server: nginx
Если я возвращаю элемент управления Nginx для обслуживания файла, он выводит следующие заголовки:
Accept-Ranges: bytes
Connection: keep-alive
Content-Length: 155576
Content-Type: image/jpeg
Date: Mon, 21 May 2018 22:31:02 GMT
ETag: "5a9af8ad-4a5b"
Last-Modified: Sat, 03 Mar 2018 19:34:05 GMT
Server: nginx
Я что-то упускаю из-за того, что браузеры не кэшируют файлы изображений?
Я попытался добавить все необходимые заголовки Cache-Control, такие как eTag и max-age, но браузеры просто отказываются кэшировать данные,Я даже попытался скопировать все заголовки из вывода сервера и использовать "ob_start ('ob_gzhandler');"на случай, если исходные данные файла не были сжаты.
Браузеры просто не будут кэшировать любые данные файла, отправленные через PHP.