Como impedir o cache de arquivos http no Apache httpd (MAMP)

139

Estou desenvolvendo um aplicativo Javascript de página única no MAMP. Meus arquivos de modelo JavaScript e HTML estão sendo armazenados em cache entre solicitações.

Existe uma maneira simples de indicar no MAMP que eu quero impedir o cache do arquivo http? Possivelmente com um .htaccessarquivo? Onde coloco .htaccessou modifico o host virtual do MAMP no Mac?

dmck
fonte

Respostas:

318

Tentei isso? Devem trabalhar em ambos .htaccess, httpd.confe em um VirtualHost(normalmente colocados em httpd-vhosts.confse você tiver incluído-lo do seu 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% impedir que arquivos sejam armazenados em cache

É semelhante à maneira como os anúncios do Google empregam o cabeçalho Cache-Control: private, x-gzip-ok = ""> para impedir o armazenamento em cache de anúncios por proxies e clientes.

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

E, opcionalmente, adicione a extensão para os arquivos de modelo que você está recuperando se estiver usando uma extensão diferente .htmldaquela.

Charlie Rudenstål
fonte
2
Obrigado, isso funciona muito bem em um arquivo .htaccess. Posso ver as opções de controle de cache quando inspeciono os cabeçalhos e meus arquivos estão aparecendo com http 200 em vez de 304 entre solicitações, exatamente o que eu precisava.
21412 dmck
2
Não se esqueça de adicionar o comando LoadModule. LoadModule headers_module lib/modules/mod_headers.so
Spenhouet 22/09/14
Posso aplicar esses cabeçalhos a todos os tipos de arquivos, em vez de definir extensões uma a uma?
Thariq Nugrohotomo
1
@ThariqNugrohotomo Sim, é possível! É uma expressão regular, você pode tentar <filesMatch "\.+">ou<filesMatch ^>
Charlie Rudenstål
Não estou usando o MAMP, mas o Apache em um servidor web. Também tive que habilitar os cabeçalhos e expirar os módulos na instalação do Apache, digitando "sudo a2enmod headers" e "sudo a2enmod expires" e, em seguida, o serviço sudo apache2 restart. Os comandos / tags LoadModule e IfModule não eram necessários - basta omitir as partes de tags IfModule entre colchetes acima, mas ainda assim inserir as configurações de cabeçalho entre elas. -
andruo11
5

Com base no exemplo aqui: http://drupal.org/node/550488

O seguinte provavelmente funcionará em .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
fonte
Infelizmente, isso não funciona quando eu coloco um arquivo .htaccess no diretório do projeto. Não tenho certeza se mod_expires está ativo.
dmck
5
@dmck: remova a seção <IfModule mod_expires.c>e </IfModule>.. se mod_expires não estiver ativado, você receberá um erro em vez de as diretivas serem silenciosamente ignoradas.
21812 Stennie
Em um diretório de projeto, qualquer pequeno erro de sintaxe aqui pode causar um erro de 500.
SDsolar
3

Eu tive o mesmo problema, mas encontrei uma boa solução aqui: Pare o cache do PHP 5.5.3 no MAMP

Encontre basicamente o arquivo php.ini e comente as linhas do OPCache. Espero que essa resposta alternativa ajude outras pessoas também.

acarito
fonte
3
trata-se de cache do PHP no lado do servidor, também conhecido como OPCache. A pergunta é sobre os arquivos que estão sendo armazenados em cache pelo navegador e solicitados por HTTP.
Flion
2

Sem mod_expires , será mais difícil definir cabeçalhos de expiração em seus arquivos. Para qualquer coisa gerada, você certamente pode definir alguns cabeçalhos padrão na resposta, fazendo o trabalho de mod_expires assim:

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

(extraído de: Resposta do Stack Overflow de @brianegge , onde a solução mod_expires também é explicada)

Agora, isso não funcionará para arquivos estáticos , como os arquivos javascript. Quanto aos arquivos estáticos, existe apenas o apache (sem nenhum módulo de expiração) entre o navegador e o arquivo de origem. Para evitar o armazenamento em cache de arquivos javascript, o que é feito no seu navegador, você pode usar um token aleatório no final do js url, algo como ?rd=45642111, para que o URL se pareça com:

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

Se esse URL na página for gerado por um arquivo PHP, você pode simplesmente adicionar a parte aleatória com o PHP. Essa maneira de randomizar o URL simplesmente anexando parâmetros aleatórios da string de consulta é a base para a configuração sem cache da solicitação do ajax jQuery, por exemplo. O navegador nunca considerará 2 URLs com cadeias de consulta diferentes iguais e nunca usará a versão em cache.

EDITAR

Observe que você também deve testar mod_headers . Se você possui mod_headers, pode definir os cabeçalhos Expira diretamente com a palavra-chave Header .

regilero
fonte
Obrigado, infelizmente não estou usando nenhum arquivo PHP. Vou olhar para mod_headers e instalar mod_expires.
Dmck 25/07
E para impedir o armazenamento em cache de arquivos CSS?
Aaron Franke
1
<FilesMatch "\.(js|css)$">
  ExpiresActive On
  ExpiresDefault A1
  Header append Cache-Control must-revalidate
</FilesMatch>
Bipin Bahuguna
fonte
Essa não é uma resposta de boa qualidade. Tente explicar detalhadamente quais são as etapas para resolver o problema relatado no OP.
leopal 3/09/19