2010-06-15 13 views
28

Tengo un sitio web cuyo mantenimiento he heredado, que es un gran desastre peludo.
Una de las cosas que hago es mejorar el rendimiento. Entre otras cosas, estoy agregando encabezados Expires a las imágenes.¿Qué podría estar agregando "Pragma: no-cache" a mis encabezados de respuesta? (Apache, PHP)

Ahora, hay algunas imágenes que se sirven a través de un archivo PHP, y veo que tienen el encabezado Expires, pero también se cargan todas las veces.

mirando las cabeceras de respuesta, veo esto:

Expires Wed, 15 Jun 2011 18:11:55 GMT 
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma no-cache 

Lo que obviamente explica el problema.

Ahora, he buscado en todo el código base, y no dice "pragma" en ninguna parte. .htaccess tampoco parece tener nada relacionado.

¿Alguna idea de lo que podría ser establecer esos encabezados "pragma" (y "cache-control"), y cómo puedo evitarlo?

Respuesta

9

Cree un archivo simple que no incluya ninguna de sus bibliotecas de PHP pero que viva en la misma carpeta que el archivo que sirve sus imágenes a través de un archivo PHP.

file: test.php 

Solicite este archivo a través de un navegador y verifique los encabezados. Si ve los encabezados de respuesta que no quiere, sabe que están configurados a través de apache y no se generan a través de un archivo PHP y puede concentrar sus búsquedas en el archivo .htaccess en el árbol de directorios y en el http.confg y otros archivos de configuración de Apache incluidos. Usted querrá buscar

<Directory.... 

y

<VirtualHost 

secciones que pueden aplicarse a su sitio.

Si no ve los encabezados en una solicitud de ese simple archivo PHP, sabrá que PHP está configurando los encabezados en algún lugar. Al final de su servicio de archivos de imagen (o justo después de que hace eco de la imagen y salidas), pero el siguiente fragmento de PHP)

var_dump(get_included_files()); 

Solicitar una imagen a través de la imagen que sirve URL. Ese fragmento de arriba imprimirá todos los archivos PHP utilizados en la solicitud. (Es probable que necesite ver la fuente o usar curl para ver la salida en bruto, como el navegador informará una imagen no válida)

Tener una parte de archivos de archivo de trabajar, buscar a través de ellos para las llamadas a la

header(); 

función. La función header es la única forma (creo) de que el código PHP sin procesar pueda establecer encabezados de Respuesta.Usted también querrá buscar

call_user_func 
eval 
$$ 

en caso de que haya cualquier código dinámico en la página que está utilizando las capacidades de programación meta de PHP para llamar a la función header.

¡Buena suerte!

+0

Wow, gracias por la respuesta detallada. Definitivamente es la configuración de Apache, pero no tengo acceso a ella. Solo tengo acceso FTP al directorio de mi sitio web. ¿Alguna idea de cómo puedo anular/eliminar estos encabezados utilizando solo mis archivos .htaccess? –

+0

Desafortunadamente, eso es demasiado general para encontrar rápidamente una respuesta. Necesitaría saber qué directivas de Apache estaban causando el almacenamiento en caché para anular los efectos Y NECESIDAD DE SABER si eran anulables en .htacess Y conocer la sintaxis para hacerlo. En lugar de perder demasiado tiempo, levanto esta cadena a los administradores del servidor y veo si no pueden ayudarlo, ya que el "almacenamiento en caché por defecto" no es la configuración predeterminada de Apache y/o el módulo PHP. #nothelpfulsorry –

+0

Muchas gracias. –

1

Si no está en .htaccess, puede estar en el archivo de configuración principal de Apache, o uno de ellos incluye, dependiendo de la configuración.

+0

¿Alguna idea sobre cómo anularla desde mi .htaccess? (No tengo acceso SSH a este servidor, o acceso a httpd.conf) –

+0

No estoy seguro de cómo * eliminar * un encabezado en realidad - intente preguntar en serverfault. –

-1

Ejecute grep -R pragma . para examinar los archivos.

+1

Eso hizo. Nada. Eso es lo que quise decir con "Miré todo el código base" –

6

Pruebe a desarmar los encabezados en .htaccess. El siguiente ejemplo no quedaran grabadas para todos los archivos que coincidan con las extensiones ico, jpeg, png, gif, js, css:

<FilesMatch "\.(ico|jpeg|png|gif|js|css)$"> 
    Header unset Cache-Control 
    Header unset Pragma 
</FilesMatch> 

se pueden encontrar algunos consejos en this article.

27

El culpable puede ser php.ini, donde session.cache_limiter = nocache. Cambie el valor a blanco o público para evitar los encabezados anticazón.

+0

¡Gracias! Cambié el valor predeterminado de session.cache_limiter ('nocache') a '' y resolvió el problema. – Yeroon

+0

Para "público", ¿no sería peligroso para un sitio web que tiene algunas páginas privadas? –

+0

Es de suponer que eso limita el almacenamiento en caché únicamente a documentos públicos. – technomage

3

Hice esto en tiempo de ejecución con esto:

header("Pragma:"); 

que obligó a la secuencia de comandos para desarmar el encabezado Pragma.

+0

Es trabajos, puedo ver que pragma fue anulado. –

10

He tenido un problema similar con Pragma: nocache

session_cache_limiter(false); antes de session_start(); parecido a suprimirla.

+0

Ver: http://php.net/manual/en/function.session-start.php – Almer

0

Vale la pena señalar para las personas con problemas similares que muchos marcos agregarán automáticamente encabezados, especialmente los que están en caché. Es bastante fácil sobrecargarlos en la biblioteca de framework o dentro de su aplicación.

+0

¿Alguna razón para el voto a favor? Sé que Zend auto agrega encabezados. Los encabezados se pueden sobrecargar a través de la etiqueta de encabezado de php tal como lo muestra Michael o el framework tendrá su función particular para hacerlo. Para Zend, tienes que usar setHeader() – twunde

Cuestiones relacionadas