2012-07-18 17 views
112

Estoy desarrollando una aplicación de una sola página para Javascript en MAMP. Mis archivos de plantilla JavaScript y HTML se almacenan en caché entre las solicitudes.Cómo evitar el almacenamiento en memoria caché de archivos http en Apache httpd (MAMP)

¿Hay una manera simple de indicar en MAMP que quiero evitar el almacenamiento en caché de archivos http? Posiblemente con un archivo .htaccess? ¿Dónde coloco el .htaccess o modifico el host virtual para MAMP en Mac?

Respuesta

258

¿Has probado esto? En caso de trabajar tanto en .htaccess, httpd.conf y en una VirtualHost (por lo general se coloca en httpd-vhosts.conf si ha incluido desde su httpd.conf)

<filesMatch "\.(html|htm|js|css)$"> 
    FileETag None 
    <ifModule mod_headers.c> 
    Header unset ETag 
    Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate" 
    Header set Pragma "no-cache" 
    Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT" 
    </ifModule> 
</filesMatch> 

100% evitar que los archivos se almacenen en caché

Esto es similar a cómo los anuncios de google emplean el encabezado Cache-Control: private, x-gzip-ok = ""> para evitar el almacenamiento en caché de los anuncios por proxies y clientes.

De http://www.askapache.com/htaccess/using-http-headers-with-htaccess.html

y, opcionalmente, añadir la extensión de los archivos de plantilla que va a recuperar si está utilizando una extensión distinta de .html para aquellos.

+2

Gracias, esto funciona muy bien en un archivo .htaccess. Puedo ver las opciones de control de caché cuando inspecciono los encabezados y mis archivos se muestran con http 200 en lugar de 304 entre las solicitudes, justo lo que necesitaba. – dmck

+2

No olvide agregar el comando LoadModule. 'LoadModule headers_module lib/modules/mod_headers.so' – Spen

+1

no funciona en Apache/2.4.12 (Ubuntu) – Sarath

5

Basado en el ejemplo aquí: http://drupal.org/node/550488

El siguiente posiblemente funcione en .htaccess

<IfModule mod_expires.c> 
    # Enable expirations. 
    ExpiresActive On 

    # Cache all files for 2 weeks after access (A). 
    ExpiresDefault A1209600 

    <FilesMatch (\.js|\.html)$> 
    ExpiresActive Off 
    </FilesMatch> 
</IfModule> 
+0

Lamentablemente, esto no funciona cuando coloco un archivo .htaccess en el directorio de mi proyecto. No estoy seguro si mod_expires está activo. – dmck

+4

@dmck: elimine la sección '' y '' .. si mod_expires no está habilitado, obtendrá un error en lugar de que esas directivas se ignoren silenciosamente. – Stennie

+0

En un directorio de proyecto, cualquier error de sintaxis leve aquí puede causar un error de 500. – SDsolar

2

Sin mod_expires que será más difícil de establecer cabeceras de vencimiento de sus archivos. Para cualquier cosa genera ciertamente puede establecer algunas cabeceras por defecto en la respuesta, haciendo el trabajo de mod_expires así:

<?php header('Expires: '.gmdate('D, d M Y H:i:s \G\M\T', time() + 3600)); ?> 

(tomado de: Stack Overflow answer from @brianegge, donde también se explica la solución mod_expires)

Ahora bien, este won No funciona para archivos estáticos, como sus archivos javascript. En cuanto a los archivos estáticos, solo hay apache (sin ningún módulo de caducidad) entre el navegador y el archivo fuente. Para evitar el almacenamiento en caché de archivos de Javascript, que se realiza en su navegador, se puede utilizar un aleatoria símbolo al final de la url js, algo así como ?rd=45642111, por lo que la URL se parece a:

<script type="texte/javascript" src="my/url/myjs.js?rd=4221159546"> 

Si esto la URL en la página se genera mediante un archivo PHP, simplemente puede agregar la parte aleatoria con PHP. Esta forma de aleatorizar URL simplemente añadiendo parámetros de cadenas de consulta aleatorias es la configuración base upôn no-cache de la solicitud de jQuery ajax, por ejemplo. El navegador nunca considerará que 2 url tengan cadenas de consulta diferentes para ser iguales, y nunca usará la versión en caché.

EDITAR

Tenga en cuenta que usted debe probar alos mod_headers. Si tiene mod_headers, puede establecer los encabezados Caduca directamente con la palabra clave Header.

+0

Gracias, desafortunadamente no estoy usando ningún archivo PHP. Buscaré mod_headers e instalaré mod_expires. – dmck

3

que tenían el mismo problema, pero me pareció una buena solución a este problema: Stop caching for PHP 5.5.3 in MAMP

Básicamente encontrar el archivo php.ini y comentar las líneas OPCache. Espero que esta respuesta alternativa ayude a otros también.

+2

que trata sobre el caché PHP en el lado del servidor, a.k.a OPCache. La pregunta es acerca de los archivos que el navegador almacena en caché y que se solicitan a través de HTTP. – Flion

-1

FWIW Tuve que reiniciar php-fpm antes de que el cambio entrara en vigor. Reiniciar Apache fue insuficiente. Me quité el pelo por un momento sobre esto.

+0

¿Qué cambio? Quizás esto debería haber sido un comentario sobre otra respuesta. – isherwood

+0

Mis disculpas, estás 100% en lo cierto. Creo que esto estaba relacionado con la respuesta justo arriba (de @acarito), pero en este momento honestamente no estoy seguro. Si terminas probándolo y confirmando que está relacionado con eso, me complacerá eliminarlo y agregarlo como comentario allí. Mientras tanto, creo que vale la pena dejarlo aquí en caso de que se trate de una respuesta diferente y termina ayudando a alguien que lucha con uno de esos. – Danny

Cuestiones relacionadas