Я выводил изображение в браузер с помощью объекта 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.
Любая помощь будет оценена по достоинству.
Из документации 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
).
Возможные решения:
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