Заголовок Cache-Control изменен сессией PHP? - PullRequest
11 голосов
/ 25 марта 2009

Я выводлю изображение в браузер, используя объект 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
без хранилища, без кэширования, обязательная повторная проверка, пост-проверка = 0, предварительная проверка = 0, максимальный возраст = 3600
Last-Modified
1234872514
Etag
d3ef646c640b689b0101f3e03e08a524
Content-Length
1452
X-UA-Compatible
IE = EmulateIE7
X-Robots-Tag
NOINDEX
Keep-Alive
тайм-аут = 15, макс = 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, выкачать
Accept-Charset
Keep-Alive
300
Подключение
держать-жив
Referer
http://khall. ####. ###. ######. Ком /
Cookie
PHPSESSID = abf5056e1289d3010448107632a1c1bd

Как видите, элемент управления кешем изменен и включает:

без хранения, без кеширования, обязательная повторная проверка, пост-проверка = 0, предварительная проверка = 0

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

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

Ответы [ 2 ]

27 голосов
/ 25 марта 2009

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

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

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

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

* 1053 публика *:

Expires: pageload + 3 hours
Cache-Control: public, max-age=10800
13 голосов
/ 25 марта 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...