2009-03-25 14 views
10

Estoy enviando una imagen al navegador utilizando un objeto Zend_Controller_Response. Es mi intención aplicar el almacenamiento en caché a la imagen, sin embargo, algo está causando que se sobrescriba el encabezado Cache-Control.Encabezado de caché-control modificado por sesión de PHP?

Mi código es el siguiente:

$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); 

La salida (como se ve en Firebug) es:

encabezados de respuesta

Fecha
Mie 25 Mar 2009 10:34:40 GMT
Servidor
Apache/2.2.3 (Ubuntu) mod_ssl/2.2.3 OpenSSL/0.9.8c
Expira
Jue 26 Mar 2009 10:34:41 GMT
Cache-Control
no-store , no-cache, debe-revalidate, después de la comprobación = 0, pre-check = 0, max-age = 3600
Last-Modified
Etag
d3ef646c640b689b0101f3e03e08a524
Content-Length
X-UA-Compatible
IE = EmulateIE7
X-Robots-Tag
noindex
Keep-Alive
timeout = 15, max = 100
Conexión
mantener- Vivo
Tipo de contenido
imagen/jpeg

Solicitar encabezados

anfitrión
khall. ####. ###. ######. Com
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
Aceptar
texto/html, application/xhtml + xml, application/xml; q = 0,9, */*; q = 0,8
Accept-Language
en-gb, en; q = 0,5
Accept-Encoding
gzip, desinflar
Accept-Charset
ISO-8859-1, UTF-8; q = 0.7, *; q = 0.7
mantenimiento de conexiones activas
conexión
de mantenimiento de conexión
Referer
http: //khall.####.###.######.com/
Cookies
PHPSESSID = abf5056e1289d3010448107632a1c1bd

Como se puede ver, se modifica el control de caché para incluir :

no-store, no-cache, debe-revalidate, después de la comprobación = 0, pre-check = 0

Mi sospecha es hacia la cookie de sesión que se envía en la petición. ¿Alguien sabe una forma de enviar el encabezado que requiero, y aún así mantener la sesión en la solicitud? Mi aplicación se ejecuta a través de un bootstrap, y las sesiones se manejan con Zend_Session.

Cualquier ayuda sería apreciada.

Respuesta

13

De la documentación Zend_Controller, sección 10.9. The Response Object

setHeader ($ nombre, $ valor, $ replace = falsa) se utiliza para establecer una cabecera individuo . De manera predeterminada, no reemplaza los encabezados existentes del mismo nombre en el objeto; sin embargo, establecer $ replace en true lo forzará a hacer .

El problema que está teniendo es su max-edad = 3600 se está agregando al encabezado de control de caché, en lugar de reemplazarlo. Intente configurar el parámetro $ replace en true.

+0

GAH! Debería golpearme en la cara. ¡Pensé que estaba pasando ese parámetro! Sin embargo, tienes razón, esa es la respuesta. –

+0

Jeje, lo hago todo el tiempo! ¿Prueba? ver http://stackoverflow.com/questions/657600/how-do-i-correctly-create-a-zend-feed – karim79

26

Tiene razón al suponer que este comportamiento está conectado al mecanismo de sesión en PHP. Hay una configuración de configuración session.cache_limiter que controla los encabezados HTTP de almacenamiento en caché que se enviarán con la respuesta. La configuración por defecto es aquí nocache que envía

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 

sobrescribe todos estos encabezados dentro de su controlador, además de la Cache-Control -header (sólo se anexa a su max-age=3600 sentado aquí).

soluciones posibles son:

  1. cambiar la configuración PHP (session.cache_limiter) a, por ejemplonone - pero esto podría introducir problemas a otras aplicaciones PHP
  2. establecer el session.cache_limiter en cada petición usando session_cache_limiter()
  3. sobrescribir el Cache-Control -header completo en su controlador con la cadena designada

Los posibles valores para session.cache_limiter y session_cache_limiter() son:

ninguno: ninguna cabecera será enviado

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 

privada:

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 

pública:

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

Gracias por su respuesta. El problema fue mi codificación apresurada, como señaló karim79: el problema está más basado en Zend Framework. Gracias por la visión, sin embargo. –

+0

Bien, esto resolvió mi pregunta: http://stackoverflow.com/questions/1937581/php-remove-http-header –

Cuestiones relacionadas