Почему изображения с моего веб-сервера не кэшируются на клиенте? - PullRequest
2 голосов
/ 04 июня 2009

Я храню все свои изображения за рутом (до /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;
?>

Ответы [ 5 ]

5 голосов
/ 04 июня 2009

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

$expiry = 3600*24*7; // A week
header('Expires: ' . gmdate('D, d M Y H:i:s' time() + $expiry) . ' GMT');
header('Cache-control: private, max-age=' . $expiry);
2 голосов
/ 04 июня 2009

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

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

1 голос
/ 04 июня 2009

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

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

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

0 голосов
/ 04 июня 2009

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

0 голосов
/ 04 июня 2009

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

...