Come prevenire la memorizzazione nella cache dei file http in Apache httpd (MAMP)


139

Sto sviluppando un'applicazione Javascript a pagina singola in MAMP. I miei file modello JavaScript e HTML vengono memorizzati nella cache tra le richieste.

Esiste un modo semplice per indicare in MAMP che desidero impedire la memorizzazione nella cache dei file http? Forse con un .htaccessfile? Dove posso posizionare .htaccesso modificare l'host virtuale per MAMP su Mac?

Risposte:


318

Hai provato questo? Dovrebbe funzionare in entrambe .htaccess, httpd.confe in un VirtualHost(di solito posto in httpd-vhosts.confse è stato incluso dal vostro 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% Impedisci che i file vengano memorizzati nella cache

Questo è simile a come gli annunci di Google utilizzano l'intestazione Cache-Control: private, x-gzip-ok = ""> per impedire la memorizzazione nella cache degli annunci da parte di proxy e client.

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

E facoltativamente aggiungi l'estensione per i file modello che stai recuperando se stai usando un'estensione diversa da .htmlquella.


2
Grazie, funziona molto bene in un file .htaccess. Riesco a vedere le opzioni di controllo della cache quando controllo le intestazioni e i miei file vengono visualizzati con http 200 anziché 304 tra le richieste, proprio quello di cui avevo bisogno.
dmck,

2
Non dimenticare di aggiungere il comando LoadModule. LoadModule headers_module lib/modules/mod_headers.so
Spenhouet,

Posso applicare quelle intestazioni a tutti i tipi di file, invece di definire le estensioni una per una?
Thariq Nugrohotomo,

1
@ThariqNugrohotomo Sì, è possibile! È un'espressione regolare, puoi provare <filesMatch "\.+">o<filesMatch ^>
Charlie Rudenstål, il

Non sto usando MAMP ma Apache su un server web. Ho dovuto anche abilitare le intestazioni e scade i moduli sulla mia installazione di Apache digitando "sudo a2enmod headers" e "sudo a2enmod scade", quindi sudo service apache2 restart. I comandi / tag LoadModule e IfModule non erano necessari: basta omettere le parti di tag IfModule tra parentesi sopra ma ancora inserire le impostazioni di intestazione tra di loro. -
andruo11

5

Sulla base dell'esempio qui: http://drupal.org/node/550488

Quanto segue probabilmente funzionerà in .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>

Purtroppo questo non funziona quando inserisco un file .htaccess nella directory del mio progetto. Non sono sicuro se mod_expires sia attivo.
dmck,

5
@dmck: rimuovi la sezione <IfModule mod_expires.c>e </IfModule>.. se mod_expires non è abilitato, otterrai un errore invece che quelle direttive vengono tranquillamente ignorate.
Stennie,

In una directory di progetto qualsiasi leggero errore di sintassi qui può causare un errore 500.
SDsolar,

3

Ho avuto lo stesso problema, ma ho trovato una buona soluzione qui: interrompere la memorizzazione nella cache per PHP 5.5.3 in MAMP

Fondamentalmente trova il file php.ini e commenta le righe OPCache. Spero che questa risposta alternativa aiuti anche gli altri.


3
si tratta della memorizzazione nella cache di PHP sul lato server, ovvero OPCache. La domanda riguarda i file memorizzati nella cache dal browser richiesti su HTTP.
Flion,

2

Senza mod_expires sarà più difficile impostare le intestazioni di scadenza sui tuoi file. Per qualsiasi cosa generata puoi certamente impostare alcune intestazioni predefinite sulla risposta, facendo il lavoro di mod_expires in questo modo:

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

(tratto da: Stack Overflow risposta da @brianegge , dove viene anche spiegata la soluzione mod_expires)

Ora questo non funzionerà con i file statici , come i tuoi file javascript. Per quanto riguarda i file statici c'è solo apache (senza alcun modulo di scadenza) tra il browser e il file di origine. Per impedire la memorizzazione nella cache dei file JavaScript, che viene eseguita sul tuo browser, puoi usare un token casuale alla fine dell'URL js, qualcosa del genere ?rd=45642111, quindi l'URL appare come:

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

Se questo URL sulla pagina viene generato da un file PHP, puoi semplicemente aggiungere la parte casuale con PHP. Questo modo di randomizzare l'URL semplicemente aggiungendo parametri di stringa di query casuali è la cosa base su un'impostazione no-cache della richiesta jQuery ajax per esempio. Il browser non considererà mai 2 url con stringhe di query diverse uguali e non utilizzerà mai la versione cache.

MODIFICARE

Nota che dovresti anche testare mod_headers . Se hai mod_headers puoi forse impostare le intestazioni Expires direttamente con la parola chiave Header .


Grazie, sfortunatamente non sto usando alcun file PHP. Esaminerò mod_headers e installerò mod_expires.
dmck,

Che dire di prevenire la memorizzazione nella cache dei file CSS?
Aaron Franke,

1
<FilesMatch "\.(js|css)$">
  ExpiresActive On
  ExpiresDefault A1
  Header append Cache-Control must-revalidate
</FilesMatch>

Questa non è una risposta di buona qualità. Prova a spiegare in dettaglio quali sono i passaggi per risolvere il problema segnalato nel PO.
leopale
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.