2009-12-21 30 views
9

Algo, pienso Apache, añade estas cabeceras HTTP para todas las respuestas generadas por scripts PHP:PHP eliminar encabezado HTTP

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

Esto funciona bien para las páginas dinámicas reales, pero tengo alguna página que, si bien genera PHP, son en su mayoría estáticos, y quiero que el navegador los guarde en caché.

¿Hay alguna manera en PHP para eliminar esos encabezados de la respuesta, y así activar las reglas de caché predeterminadas del navegador, o si no, ¿hay algún valor que pueda establecer para que sea equivalente con ellos ausentes?

Preferiría no establecer mis propios valores, porque quiero que el navegador use las mismas reglas de almacenamiento en caché que para los recursos estáticos que son servidos por Apache (sin usar mod_cache).

Respuesta

2

Primero compruebo si realmente no es uno de los scripts php que establece estos encabezados.

register_shutdown_function('foo'); 
echo "test"; 

function foo() { 
    flush(); 
    $c = "headers_list: \n " . join("\n ", headers_list()); 

    if (function_exists('apache_response_headers')) { 
    $c .= "\napache_response_headers:"; 
    foreach(apache_response_headers() as $k=>$v) { 
     $c.= "\n $k=$v"; 
    } 
    } 
    $c .= "\n\n"; 
    echo '<pre>', $c, '</pre>'; 
} 

¿Esto imprime algo "utilizable" en su servidor?

+1

He realizado la investigación, y parece que PHP establece los encabezados cuando usa las funciones de sesión. en torno a los documentos pertinentes. Hay formas de cambiar el valor de los encabezados, pero no impedir que se establezcan. –

+2

En realidad, la configuración de session.cache_limit a "none" (valor no documentado) la resolvió. Consulte http://stackoverflow.com/questions/681115/cache-control-header-modified-by-php-session –

+0

wow, no habría pensado en eso durante años ;-) – VolkerK

2

Puede proporcionar encabezados HTTP manualmente desde PHP a través de la función header().

Me imagino que al hacerlo debería desactivar los valores de encabezado predeterminados del servidor web.

+0

Si los configuro en una cadena vacía, p. "Cache-Control:", ¿los navegadores interpretarán esto de la misma manera que cuando está ausente? –

+0

¿Estás seguro de que PHP no solo está agregando las líneas de encabezado, sino que generará un encabezado completamente nuevo? – dusoft

+0

El comportamiento predeterminado es reemplazar los encabezados existentes con el mismo nombre, como se ve en el docs for header() –

7

Para esos archivos en particular, podría agregar llamadas de encabezado() que establezcan esos encabezados de manera diferente. es decir. header("Expires: " . $currentDatePlus10);

header("Cache-Control: max-age=3600, must-revalidate") 
+0

Si es posible, me gustaría eliminar los encabezados por completo, para que el comportamiento del navegador sea exactamente el mismo que para los archivos estáticos normales en un servidor desconfigurado –

+0

Dado que ocurre fuera del entorno PHP, sin excavar en Apache, sobrescribirlo con otro valor sería su mejor opción. Normalmente usaré fechas de vencimiento ridículas para contenido estático (leer 10 años) para mantener el contenido en caché. – Myles

+1

Me preocupa que si establezco una fecha de 10 años en el futuro, los usuarios realmente no captarán los cambios. –

1
header("Expires: Fri, 1 Jan 2038 05:00:00 GMT"); 

o algún tiempo igualmente absurdo en un futuro lejano. Recuerde establecer los valores de su encabezado antes de enviar cualquier salida, a menos que esté haciendo un buffer de salida para toda su página.

http://php.net/manual/en/function.header.php

0

suprimir la de la memoria caché se puede hacer de la siguiente manera: Código PHP:

header ("Cache-Control: no-cache, must-revalidate");// HTTP/1.1 
header ("Expires: Mon, 1 Jul 1990 05:00:00 GMT");// Date in the past 

si desea generar automáticamente, entonces usted esta aquí: PHP: session_cache_limiter() - Manual de ellos

+0

Esto es exactamente lo que estoy tratando de evitar –

+0

lo siento pero no tiene acceso a los rollos de caché del navegador por lo que tiene que usar http://at.php.net/manual/de/function.session-cache- expire.php – streetparade

-1

No he intentado esto pero probablemente podría guardar páginas como archivos .html con sus encabezados personalizados o la falta de ellos y el script podría ejecutarse dentro del

0

Es probable que haya algún lugar en su código que establezca estas variables, ya que no puedo encontrar dónde PHP las inserta automáticamente en ninguna parte, ni tampoco están en ninguna de mis instalaciones LAMP.

El único encabezado generado automáticamente para mis instalaciones es X-Powered-By con la versión de PHP.

Como usted ha dicho, a partir de los documentos que recomiendan diciendo header("Expires:"); para reemplazar la antigua cabecera, pero header("Cache-control:"); acaba de convertirse en Cache-Control: max-age=0 en mi navegador (así que esto no es lo que estamos tratando de hacer).

Recomiendo comprobar si estos valores provienen de un marco o configuración que ha cambiado, pero puede ser diferente en las diferentes versiones de PHP/plataformas con las que ejecutará PHP.

Buscaría las directivas ExpiresByType o ExpiresDefault en global configs, vhosts, pr.htaccess o cualquier bloqueo o encapsulados en <IfModule mod_expires><IfModule mod_expires.c>

"Quiero que el navegador para usar las mismas reglas de caché como para recursos estáticos que son atendidas por sí Apache (sin utilizar mod_cache)."

Intente buscar un recurso estático y luego hacer coincidir las reglas. Puede calcular el tiempo de caducidad más cercano con esto ->http://www.php.net/manual/en/function.header.php#93377

+0

Estoy seguro de que los encabezados no están configurados desde PHP. @ "Intenta mirar un recurso estático y luego hacer coincidir las reglas". Ese es el punto, no tienen estos encabezados;) –

+0

déjeme simplificarlo, "¿Hay algún valor que pueda establecer para ellos? ¿Eso es equivalente a que estén ausentes?" no realmente. (En blanco) será interpretted por cada navegador. 'yo preferiría no fijar mis propios valores' esto es imposible, ya que usted o su anfitrión ya tiene en alguna parte. –

+0

Ok, yo estaba seguro de que el los encabezados no fueron establecidos por mi código. Aparentemente, están configurados por PHP cuando usa sus sesiones. Vea mi comentario @VolkerK –

1

Estas cabeceras de caché se envían cuando empiece a usar sesiones y se pusieron a "nocache" por defecto; esto asegura que cada solicitud arroje resultados consistentes.

Por ejemplo, si tiene un sistema de carro y su navegador almacena en caché /add?product=xyz, es posible que no agregue el producto nuevamente; esto probablemente no es lo que quieres.

Una vez dicho esto, la configuración predeterminada se puede cambiar, ya sea usando session_cache_limiter()antessession_start() o establecer el valor de configuración session.cache_limiter correspondiente.