2012-07-18 15 views
112

Sto sviluppando un'applicazione JavaScript a pagina singola in MAMP. I miei file modello JavaScript e HTML vengono memorizzati nella cache tra le richieste.Come impedire la memorizzazione nella cache del file http in Apache httpd (MAMP)

C'è un modo semplice per indicare in MAMP che voglio impedire il caching del file http? Possibilmente con un file .htaccess? Dove posso posizionare lo .htaccess o modificare l'host virtuale per MAMP su Mac?

risposta

258

Provato questo? Dovrebbe funzionare in entrambe .htaccess, httpd.conf e in un VirtualHost (di solito posto in httpd-vhosts.conf se è 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% File impediscono di essere memorizzate nella cache

Questo è simile al modo in cui gli annunci di google utilizzano l'intestazione Cache-Control: private, x-gzip-ok = ""> per impedire la memorizzazione nella cache di annunci da parte di proxy e client.

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

e opzionalmente aggiungere l'estensione per i file di modello si stanno recuperando se si sta utilizzando un'estensione diversa da .html per quelli.

+2

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

+2

Non dimenticare di aggiungere il comando LoadModule. 'LoadModule headers_module lib/modules/mod_headers.so' – Spen

+1

non funziona in Apache/2.4.12 (Ubuntu) – Sarath

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> 
+0

Purtroppo questo non funziona quando inserisco un file .htaccess nella mia directory di progetto. Non sono sicuro che mod_expires sia attivo. – dmck

+4

@dmck: rimuovi la sezione '' e '' se mod_expires non è abilitato, riceverai un errore invece di ignorare quelle direttive. – Stennie

+0

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

2

Senza mod_expires sarà più difficile per impostare le intestazioni di scadenza sui file. Per tutto ciò ha generato si può certamente impostare alcune intestazioni di default sulla risposta, facendo il lavoro di mod_expires così:

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

(tratto da: Stack Overflow answer from @brianegge, dove la soluzione mod_expires si spiega anche)

Ora questo won funziona per i file statici , come i file javascript. Per quanto riguarda i file statici c'è solo apache (senza alcun modulo di scadenza) tra il browser e il file sorgente. Per evitare la memorizzazione nella cache di file JavaScript, che è fatto sul vostro browser, è possibile utilizzare un casuale pedina alla fine dell'URL js, qualcosa come ?rd=45642111, quindi l'url assomiglia:

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

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

EDIT

noti che si dovrebbe alos testare mod_headers. Se hai mod_headers puoi magari impostare le intestazioni Expires direttamente con la parola chiave Header.

+0

Grazie, purtroppo non sto usando alcun file PHP. Guarderò mod_headers e installando mod_expires. – dmck

3

ho avuto lo stesso problema, ma ho trovato una buona soluzione qui: Stop caching for PHP 5.5.3 in MAMP

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

+2

che riguarda il caching PHP sul lato server, a.k.a OPCache. La domanda riguarda i file che vengono memorizzati nella cache dal browser richiesto su HTTP. – Flion

-1

FWIW Ho dovuto riavviare php-fpm prima che la modifica diventasse effettiva. Il riavvio di Apache era insufficiente. Mi sono tirato fuori i capelli per un po '.

+0

Che cambiamento? Forse questo dovrebbe essere stato un commento su un'altra risposta. – isherwood

+0

Le mie scuse, hai ragione al 100%. Credo che questo fosse correlato alla risposta subito sopra (da @acarito), ma a questo punto non sono sinceramente sicuro. Se finisci per provarlo e confermi che è effettivamente collegato a questo, sarò felice di eliminarlo e aggiungerlo come commento. Nel frattempo, penso che valga la pena lasciarlo qui, nel caso in cui riguardi una risposta diversa e finisca per aiutare qualcuno che sta lottando con uno di questi. – Danny

Problemi correlati