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?

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.


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>

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.


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 .


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>

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.