Заголовок кэша-контроля, измененный сеансом PHP?

Я выводил изображение в браузер с помощью объекта Zend_Controller_Response. Я намерен применить кэширование к изображению, однако что-то вызывает перезапись заголовка Cache-Control.

Мой код выглядит следующим образом:

$this->getResponse()
    ->setHeader('Last-Modified', $modifiedTime, true)
    ->setHeader('ETag', md5($modifiedTime), true)
    ->setHeader('Expires', $expires, true)
    ->setHeader('Pragma', '', true)
    ->setHeader('Cache-Control', 'max-age=3600')
    ->setHeader('Content-Type', $mimeType, true)
    ->setHeader('Content-Length', $size, true)
    ->setBody($data);

Вывод (если смотреть в Firebug):

Заголовки ответов

<Дл > Дата Wed, 25 Mar 2009 10:34:40 GMT Сервер Apache/2.2.3 (Ubuntu) mod_ssl/2.2.3 OpenSSL/0.9.8c Истекает Thu, 26 Mar 2009 10:34:41 GMT Cache-Control no-store, no-cache, must-revalidate, post-check = 0, pre-check = 0, max-age = 3600 <Дт > Last-Modifiedдт > <дд > 1234872514дд > <Дт > Etagдт > <дд > d3ef646c640b689b0101f3e03e08a524дд > <Дт > Content-Lengthдт > <дд > тысяче четыреста пятьдесят дведд > <Дт > X-UA-Compatibleдт > <дд > IE = EmulateIE7дд > <Дт > X-Robots-Tagдт > <дд > NOINDEXдд > Keep-Alive timeout = 15, max = 100 <Дт > Подключениедт > <дд > Keep-Aliveдд > <Дт > Content-Typeдт > <дд > изображение/JPEGдд > Дл >

Заголовки запросов

<Дл > <Дт > Хостдт > <дд > khall. ####. ###. ######. Комдд > User-Agent Mozilla/5.0 (X11; U; Linux i686; en-US; rv: 1.9.0.7) Gecko/2009030422 Ubuntu/8.04 (hardy) Firefox/3.0 0,7дд > <Дт > Принятьдт > <дд > текст /HTML, приложение/XHTML + XML, приложение /XML; д = 0,9, */*; д = 0,8дд > <Дт > Accept-Languageдт > <дд > ан-ГБ, ан; д = 0,5дд > <Дт > Accept-Encodingдт > <дд > GZIP, Deflateдд > <Дт > Accept-Charsetдт > <дд > ISO-8859-1, UTF-8; д = 0,7, *; д = 0,7дд > <Дт > Keep-Aliveдт > <дд > 300дд > <Дт > Подключениедт > <дд > поддержания активностидд > <Дт > Refererдт > <дд > Http://khall.####.###.######.com/дд > <Дт > Печеньедт > <дд > PHPSESSID = abf5056e1289d3010448107632a1c1bdдд > Дл >

Как вы можете видеть, управление кэшем изменено, чтобы включить:

no-store, no-cache, must-revalidate, post-check = 0, pre-check = 0

Мое подозрение касается отправки cookie сеанса в запросе. Кто-нибудь знает способ отправить требуемый заголовок, но все же сохранить сеанс в запросе? Мое приложение запускается через бутстрап, а сеансы обрабатываются с помощью Zend_Session.

Любая помощь будет оценена.

Ответ 1

Из документации Zend_Controller, раздел 10.9. Объект ответа

setHeader ($ name, $value, $replace = false) используется для установки индивидуального заголовок. По умолчанию он не заменить существующие заголовки того же имя в объекте; однако установка $replace to true заставит это сделать поэтому.

Проблема, с которой вы сталкиваетесь, - это ваш максимальный возраст = 3600, который добавляется к заголовку управления кешем, а не к его замене. Попробуйте установить параметр $replace на true.

Ответ 2

Вы правы, полагая, что это поведение связано с механизмом сеанса в PHP. Существует параметр конфигурации session.cache_limiter, который управляет кешированием HTTP-заголовков, которые будут отправляться с ответом. Значение по умолчанию здесь nocache, которое отправляет

Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache

Вы перезаписываете все эти заголовки внутри своего контроллера, кроме Cache-Control -header (добавьте здесь только max-age=3600).

Возможные решения:

  • изменение конфигурации PHP (session.cache_limiter), например. none - но это может привести к проблемам с другими приложениями PHP.
  • установите session.cache_limiter по каждому запросу, используя session_cache_limiter()
  • перезапишите полный Cache-Control -header в контроллере с указанной строкой

Возможные значения для session.cache_limiter и session_cache_limiter():

none: ни один заголовок не будет отправлен

NoCache

Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache

частный

Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private, max-age=10800, pre-check=10800

private_no_expire

Cache-Control: private, max-age=10800, pre-check=10800

общественности

Expires: pageload + 3 hours
Cache-Control: public, max-age=10800