Почему изображения, поданные с моего веб-сервера, не кэшируются на клиенте?

Я сохраняю все мои изображения за webroot (до /var/www/ ), что означает, что веб-сервер не может отправлять заголовки кэша обратно для моих изображений. Что мне нужно добавить к этому, чтобы заставить веб-кеш пользователя работать? В настоящее время это происходит каждый раз в том же браузере.

Мой путь <img> на моих страницах выглядит примерно так:

 <img src="pic.php?u=1134&i=13513&s=0"> 

Изменить: Может быть, это потому, что « pic.php?u=1134&i=13513&s=0 » не является допустимым именем файла или чем-то еще?

 // pic.php <?php // open the file in a binary mode $user = $_GET['u']; $id = $_GET['i']; $s = $_GET['s']; if (!isset($user) && !isset($s) && $isset($id)) { // display a lock! exit(0); } require_once("bootstrap_minimal.php"); //setup db connection, etc // does this image_id belong to the user? $stmt = $db->query('SELECT image_id, user_id, file_name, private FROM images WHERE image_id = ?', $id); $obj = $stmt->fetchObject(); if (is_object($obj)) { // is the picture is the users? if ($obj->user_id != $_SESSION['user_id']) { // is this a private picture? if ($obj->private == 1) { // check permissions... // display a lock in needed! } } } else { // display a error pic?! exit(0); } if ($s == 0) { $picture = $common->getImagePathThumb($obj->file_name); } else { $picture = $common->getImagePath($obj->file_name); } // send the right headers header("Content-Type: image/png"); header("Content-Length: " . filesize($picture)); $fp = fopen($picture, 'rb'); // dump the picture and stop the script fpassthru($fp); exit; ?> 

Вам нужно добавить что-то вроде:

 $expiry = 3600*24*7; // A week header('Expires: ' . gmdate('D, d MYH:i:s' time() + $expiry) . ' GMT'); header('Cache-control: private, max-age=' . $expiry); 

По умолчанию Apache кэширует только статические файлы. Вам нужно отправить заголовок управления кэшем через функцию header() . В этой статье много информации по этой теме.

Кроме того, вы можете использовать файл PHP для перенаправления на фактическое местоположение изображения. (Это, наверное, самый простой способ, если вы ничего не знаете о заголовках.)

Вы можете попробовать:

 header("Cache-Control: max-age=3600"); 

Это должно отправить тайм-аут кеша на один час в файле.

Что бы я делал в вашей ситуации, это поток байтов изображения с помощью .php-файла. Не связывайтесь напрямую с изображениями; вместо этого, ссылается на файл php, который: – выводит заголовки кеша – считывает файл с диска, из-за webroot – отправляет биты изображения вниз по проводу

Простой ответ: вы не говорите браузеру своих пользователей, чтобы кэшировать его