Заголовок кэша-контроля, измененный сеансом 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):

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

Дата
Ср, 25 марта 2009 10:34:40 GMT
сервер
Apache / 2.2.3 (Ubuntu) mod_ssl / 2.2.3 OpenSSL / 0.9.8c
Истекает
Чт, 26 марта 2009 10:34:41 GMT
Cache-Control
no-store, no-cache, must-revalidate, post-check = 0, pre-check = 0, max-age = 3600
Последнее изменение
1234872514
Etag
d3ef646c640b689b0101f3e03e08a524
Content-Length
1452
X-UA-Compatible
IE = EmulateIE7
X-Robots-Tag
NOINDEX
Keep-Alive
timeout = 15, max = 100
соединение
Keep-Alive
Тип содержимого
изображение / 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 .7
принимать
Текст / HTML, приложение / XHTML + XML, приложение / XML; д = 0,9, * / *; д = 0,8
Accept-Language
ан-ГБ, ан; д = 0,5
Accept-Encoding
GZIP, выкачать
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.

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

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

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

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

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

Вы правы, полагая, что это поведение связано с механизмом сеанса в 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 ).

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

  1. изменение конфигурации PHP ( session.cache_limiter ), например, none но это может привести к проблемам с другими приложениями PHP
  2. установите session.cache_limiter для каждого запроса с помощью session_cache_limiter()
  3. перезапишите полный 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