2010-04-07 14 views
7

Descargué Google Speed ​​Tracer para Google Chrome para ver cómo mi sitio funciona bien y me dice que necesito habilitar el almacenamiento en caché para ciertos archivos como mi style.css, imágenes, etc.cómo usar los encabezados de la caché de control?

He leído que el debajo del código php debería decirle a los navegadores que guarden en caché el contenido html. Escribí una página php rápida con un par de imágenes y pegué el código de abajo en la parte superior (antes de que se envíen los encabezados) para probar cómo funcionaba.

Header("Cache-Control: public, max-age=3600, must-revalidate"); 

Cuando vuelva al análisis del trazador de velocidad que dice ...

Resumen De caché: falsa

Solicitar encabezados Pragma: no caché Cache-Control: max-age = 0

pero bajo Encabezados de respuesta ... Cache-Control:, max-age = 3600 público, debe-revalidate (exactamente lo que he especificado)

estoy un poco confundido, lo que está pasando ...? Cuando dice desde el caché: ¿falso significa eso del caché del servidor y no del caché del cliente?

+0

por favor mantenganme informado de sus hallazgos –

Respuesta

4

La clave es obligada revalidar: Esto quiere decir, que el cliente está pidiendo al servidor si el archivo ha cambiado. Si no maneja este caso, el navegador buscará una nueva copia.

Lea Mark Nottingham’s fantastic Caching Tutorial para obtener más información. Como ejemplo para una implementación de PHP puede usar my code.

Busque en $_SERVER['HTTP_IF_NONE_MATCH'] y $_SERVER['HTTP_IF_MODIFIED_SINCE'] para validar clientes. Y tenga en cuenta que ambos encabezados pueden contener código malicioso. ;)

+0

Entonces, lo que dice es que es posible almacenar en caché "imágenes, CSS, scripts, etc." usando este método sin tener que modificar las configuraciones del servidor? – payling

+0

Sí, el servidor maneja los archivos estáticos. Los archivos ejecutables (PHP, SSI, CGI) tienen que hacer esto solos, porque el servidor no puede saber qué contenido producen. – fuxia

+0

Esta respuesta es incorrecta: el encabezado proporcionado forzará el almacenamiento en caché del contenido si se implementa correctamente. – symcbean

0

Cuando se dice de la caché: falsa hace que significa desde la caché del servidor y no caché del cliente?

^Esto se refiere a la memoria caché del cliente.

Configurar el almacenamiento en caché de esta manera cubrirá sus archivos PHP, pero tendrá que implementar algo más del lado del servidor para almacenar sus imágenes, CSS, scripts, etc. Esto se puede hacer usando .htaccess, si su servidor lo admite .

Por ejemplo, esto es lo que estoy usando en mi archivo .htaccess para un par de sitios.

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)(\.gz)?$"> 
    Header set Expires "Thu, 15 Apr 2012 20:00:00 GMT" 
    Header unset ETag 
    FileETag None 
</FilesMatch> 
+0

Desearía que fuera tan simple como insertar un archivo .htaccess en el directorio de mi sitio. Nuestra empresa alquila un servidor IIS6 (que no usa archivos .htaccess) y yo no tener control directo sobre el servidor que no sea un ftp en el directorio del sitio ... – payling

+0

@payling: IIS probablemente tenga sus propios manejadores de configuración para hacer lo mismo, pero si todo lo demás falla, podría usar un archivo PHP para servir a su css/etc, en forma de encabezados ' '. Sin embargo, en realidad solo deberías hacer eso si es necesario. – pinkgothic

0

No estoy familiarizado con esta herramienta, sin embargo, hasta que ningún navegador haya obtenido contenido con encabezados de almacenamiento en caché, no podrá almacenarlo en caché. Parece que su servidor está devolviendo los encabezados esperados y el navegador debe almacenar en caché la página: su navegador debe tener ahora tener una copia en su caché. Si intenta obtener la misma página nuevamente, la obtendrá del caché en lugar del servidor de origen (suponiendo que el límite de tiempo de 1 hora no ha expirado).

Tenga en cuenta que algunos navegadores interpretarán una petición de actualización como una petición explícita de ignorar el caché y buscar la página de nuevo - intente acceder a él a través del enlace en lugar de golpear el botón de actualización.

C.

+0

Por lo que puedo decir, el código que publiqué no hace nada por mí. Utilicé el violín para analizar el tráfico y con o sin el código que el navegador estaba dibujando a partir de imágenes en caché/hojas de estilo. Esto me confunde porque Speed ​​Tracer estaba diciendo lo contrario ... Voy a pasar un poco más averiguando qué está pasando. – payling

0

Es necesario entender lo que estas directivas Cache-Control header field realmente significan:

  • public:

    Indica que la respuesta puede ser almacenado en caché por cualquier caché, incluso si normalmente no sería almacenable en caché o caché solo dentro de un caché no compartido. (Ver también Authorization, section 14.8, para obtener detalles adicionales.)

  • max-age=3600 especificado que la respuesta es fresco para 3600 segundos:

    Cuando la directiva máximo de edad de control de caché está presente en una caché respuesta, la respuesta es obsoleta si su edad actual es mayor que el valor de edad dado (en segundos) en el momento de una nueva solicitud para ese recurso. La directiva de máximo de edad en una respuesta implica que la respuesta es almacenable en caché (es decir, "pública") a menos que también esté presente alguna otra directiva de caché más restrictiva.

  • must-revalidate especifica que una caché debe revalidar una respuesta en caché después de que comenzó a estancarse antes de usar esa respuesta en caché para satisfacer la petición:

    Cuando la directiva que hay que revalidar está presente en una respuesta recibido por un caché, ese caché NO DEBE usar la entrada después de que se vuelva obsoleta para responder a una solicitud posterior sin antes revalidarla con el servidor de origen. (Es decir, el caché DEBE hacer una revalidación de extremo a extremo cada vez, si, basándose únicamente en el valor Expira o max-age del servidor de origen, la respuesta en caché no es correcta). [...] Los servidores DEBERÍAN enviar la directiva must-revalidate si y solo si el hecho de no revalidar una solicitud en la entidad podría dar como resultado un funcionamiento incorrecto, como una transacción financiera silenciosamente no ejecutada.

Ahora bien, este es el significado deseado de estas directivas.

Pero como siempre, la realidad es un poco diferente: Especialmente hay que revalidar no se interpreta sólo a revalidar una respuesta en caché sólo después de que comenzó a estancarse, sino que tiene que ser revalidado en cada petición posterior o que debe no se debe almacenar en caché (probablemente sea por eso que envía Cache-Control: max-age=0 en la solicitud posterior).

El "Desde caché: falso" parece indicar que la respuesta no provino de un caché sino directamente del servidor.

Cuestiones relacionadas