Cómo evitar el almacenamiento en caché de archivos http en Apache httpd (MAMP)

139

Estoy desarrollando una aplicación Javascript de una sola página en MAMP. Mis archivos de plantilla JavaScript y HTML se almacenan en caché entre solicitudes.

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

dmck
fuente

Respuestas:

318

Probado esto? Debería funcionar en ambos .htaccess, httpd.confy en un VirtualHost(generalmente colocado httpd-vhosts.confsi lo 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% evita 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 anuncios por parte de servidores proxy y clientes.

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

Y, opcionalmente, agregue la extensión para los archivos de plantilla que está recuperando si está usando una extensión distinta de .htmlesas.

Charlie Rudenstål
fuente
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 aparecen con http 200 en lugar de 304 entre solicitudes, justo lo que necesitaba.
dmck
2
No olvide agregar el comando LoadModule. LoadModule headers_module lib/modules/mod_headers.so
Spenhouet
¿Puedo aplicar ese encabezado a todos los tipos de archivos, en lugar de definir extensiones una por una?
Thariq Nugrohotomo
1
@ThariqNugrohotomo ¡Sí, es posible! Es una expresión regular, puedes probar <filesMatch "\.+">o<filesMatch ^>
Charlie Rudenstål
No estoy usando MAMP sino Apache en un servidor web. También tuve que habilitar los encabezados y los módulos que caducan en mi instalación de Apache escribiendo "encabezados sudo a2enmod" y "sudo a2enmod caduca", y luego reiniciar el servicio sudo apache2. Los comandos / etiquetas LoadModule e IfModule no eran necesarios, solo omita las partes de la etiqueta IfModule entre corchetes anteriores pero aún ingrese la configuración de Encabezado entre ellas. -
andruo11
5

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

Lo siguiente probablemente funcionará 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>
Frank Farmer
fuente
Desafortunadamente, esto no funciona cuando pongo un archivo .htaccess en el directorio de mi proyecto. No estoy seguro si mod_expires está activo.
dmck
55
@dmck: elimine la sección <IfModule mod_expires.c>y </IfModule>... si mod_expires no está habilitado, obtendrá un error en lugar de ignorar esas directivas en silencio.
Stennie
En un directorio de proyecto, cualquier pequeño error de sintaxis aquí puede causar un error 500.
SDsolar
3

Tuve el mismo problema, pero encontré una buena solución aquí: detener el almacenamiento en caché para PHP 5.5.3 en MAMP

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

acarito
fuente
3
eso es sobre el almacenamiento en caché de PHP en el lado del servidor, también conocido como OPCache. La pregunta es sobre los archivos que el navegador almacena en caché y que se solicitan a través de HTTP.
Flion
2

Sin mod_expires , será más difícil establecer encabezados de caducidad en sus archivos. Para cualquier cosa generada, ciertamente puede configurar algunos encabezados predeterminados 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: Respuesta de desbordamiento de pila de @brianegge , donde también se explica la solución mod_expires)

Ahora esto no funcionará 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 javascript, que se realiza en su navegador, puede usar un token aleatorio al final de la url js, algo así ?rd=45642111, para que la url se vea así:

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

Si esta URL en la página es generada por un archivo PHP, simplemente puede agregar la parte aleatoria con PHP. Esta forma de aleatorizar url simplemente agregando parámetros de cadena de consulta aleatoria es la base de la configuración de no caché de la solicitud ajax jQuery, por ejemplo. El navegador nunca considerará que 2 url con cadenas de consulta diferentes sean iguales, y nunca usará la versión en caché.

EDITAR

Tenga en cuenta que también debería probar mod_headers . Si tiene mod_headers, puede configurar los encabezados Expires directamente con la palabra clave Header .

regilero
fuente
Gracias, desafortunadamente no estoy usando ningún archivo PHP. Examinaré mod_headers e instalar mod_expires.
dmck
¿Qué pasa para evitar el almacenamiento en caché de archivos CSS?
Aaron Franke
1
<FilesMatch "\.(js|css)$">
  ExpiresActive On
  ExpiresDefault A1
  Header append Cache-Control must-revalidate
</FilesMatch>
Bipin Bahuguna
fuente
Esa no es una respuesta de buena calidad. Intente explicar en detalle cuáles son los pasos para resolver el problema informado en el OP.
leopal