PHP: потоковое изображение вне Webroot и кэширования - PullRequest
1 голос
/ 23 марта 2012

Я использую Apache, и когда я запрашиваю изображение напрямую в первый раз, статус изображения «200 OK». Последующие запросы имеют статус «304 Не изменен», что хорошо, поскольку экономит полосу пропускания как для клиента, так и для сервера.

Я работаю над сайтом, который позволит пользователям загружать изображения. Эти изображения должны храниться вне рут-корня не только для предотвращения хотлинкинга, но и для сбора статистики по изображениям. Поэтому я подумал о том, чтобы использовать такой PHP-скрипт для потоковой передачи изображений:

<?php

    $image_to_stream = '/path/outside/of/webroot/image.jpg';
    $cache_seconds = 2592000; // 30 days

    header("Cache-Control: max-age=$cache_seconds");
    header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $cache_seconds) . ' GMT');
    header('Pragma: cache');
    header('Content-Type: image/jpg');
    header('Content-length: ' . filesize($image_to_stream));

    readfile($image_to_stream);

?>

Однако сценарий всегда имеет статус «200 OK», и все изображение передается в потоковом режиме. Есть ли способ исправить это или я должен использовать другой подход или как? Спасибо!

1 Ответ

0 голосов
/ 23 марта 2012

Вам необходимо обработать заголовок запроса If-Modified-Since.

Обычно проверяйте отметку времени в этом файле локально.Если он изменился с даты, указанной в заголовке If-Modified-Since, верните его.В противном случае отправьте bac, значение 304 не изменилось.

Из RFC:

Метод GET с заголовком If-Modified-Since и без заголовка Range запрашивает, чтобы идентифицированный объект былпередается, только если он был изменен с даты, указанной в заголовке If-Modified-Since.Алгоритм определения этого включает следующие случаи:

a) Если запрос обычно приводит к чему-либо, кроме статуса 200 (ОК), или если переданная дата If-Modified-Since недопустима, ответточно так же, как для обычного GET.Дата, которая является более поздней, чем текущее время сервера, недействительна.

b) Если вариант был изменен после даты If-Modified-Since, ответ точно такой же, как и для обычного GET.

c) Если вариант не был изменен после действительной даты If-Modified-Since, сервер ДОЛЖЕН вернуть ответ 304 (не изменен).

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

Вы можете отправить это с помощью этого кода PHP:

header('HTTP/1.1 304 Not Modified', true, 304);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...