Utilizzando Apache 2.4 su Debian 8.2, sto cercando di abilitare il caching di tutti i file css e js. Il caching delle immagini funziona bene; cioè, il browser riceve uno stato 304, quindi non lo scarica di nuovo. Ma non riesco a far funzionare la memorizzazione nella cache di altri file.Abilita il caching dei file css e js in Apache
Io uso questo all'interno di un file host virtuale:
<IfModule mod_expires.c>
<FilesMatch "\.(jpe?g|png|gif|js|css)$">
ExpiresActive On
ExpiresDefault "access plus 1 week"
</FilesMatch>
</IfModule>
Il modulo expires
è abilitato. Ho riavviato apache, pulito i cookie del browser, ecc. Nessun successo.
La risposta per un'immagine GIF, da strumenti per gli sviluppatori del browser:
Cache-Control:max-age=604800
Connection:Keep-Alive
Date:Wed, 25 Nov 2015 21:37:50 GMT
ETag:"4174a-4e69c97fbf080"
Expires:Wed, 02 Dec 2015 21:37:50 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.10 (Debian)
La risposta di un file css:
Accept-Ranges:bytes
Cache-Control:max-age=604800
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:135
Content-Type:text/css
Date:Wed, 25 Nov 2015 21:37:50 GMT
ETag:"5116-525639d271c78-gzip"
Expires:Wed, 02 Dec 2015 21:37:50 GMT
Keep-Alive:timeout=5, max=99
Last-Modified:Wed, 25 Nov 2015 20:50:52 GMT
Server:Apache/2.4.10 (Debian)
Vary:Accept-Encoding
Sembra che il scade intestazione è impostato correttamente, ma il browser continua a richiedere il file (200 OK).
Ho provato con Chrome e Firefox.
Sommario:
1.) quando seguo i collegamenti all'interno del sito web, il browser utilizza i file memorizzati nella cache. Ma quando premo F5, scaricano nuovamente i file css e js, ma non riescono a scaricare nuovamente le immagini. Le immagini danno 304. Va bene.
2.) Quando premo Ctrl-F5, in modo naturale, tutti i file vengono scaricati di nuovo. Anche quello va bene.
3.) Quindi il problema è come abilitare il caching (proprio come le immagini) per altri file. Perché l'apache discrimina tra immagini e altri file? Non ho messo nulla di speciale per le immagini nei file di configurazione.
D: Come abilitare correttamente il caching dei file css e js?
Un altro Q: c'è una speciale intestazione http che dice al browser di non richiedere mai il file. Il motivo è, inviando anche una richiesta per verificare se il file è modificato richiede 100-200 ms, che è troppo. Sono sicuro che i file non saranno modificati. E se vengono modificati, posso facilmente inserire una stringa di versione alla fine del file css, come myFile.css? V = 1.1 Quindi spero che ci dovrebbe essere un modo per interrompere completamente l'invio delle richieste.
risolto
In primo luogo, c'è un bug in Apache come accennato nella risposta qui di seguito.
In secondo luogo, c'era un equivoco da parte mia. Immagino che questo sia il modo in cui funzionano i browser moderni:
1.) Segui i collegamenti all'interno di un sito Web: non viene inviata alcuna richiesta, anche per verificare se il file è stato modificato.
2.) F5: invia una richiesta. Se il file non viene modificato, il server risponde 304.
3.) Ctrl + F5: download completo.
Il comportamento su F5 non ha senso per me. Comunque.
Nel caso in cui nessuno ha bisogno, qui è una soluzione di lavoro che ho messo in file di host virtuale:
RequestHeader edit "If-None-Match" "^\"(.*)-gzip\"$" "\"$1\""
Header edit "ETag" "^\"(.*[^g][^z][^i][^p])\"$" "\"$1-gzip\""
LoadModule expires_module /usr/lib/apache2/modules/mod_expires.so
ExpiresActive On
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
ExpiresDefault "access plus 4 weeks"
</FilesMatch>
Perché solo in parte? E non sono a conoscenza dei browser che utilizzano le richieste HEAD. Non avrebbe molto senso, come dovrebbe essere seguito con una richiesta completa in modo da utilizzare solo una richiesta GET condizionale e fare tutto in un colpo solo. –
F5 esegue un aggiornamento manuale per verificare eventuali aggiornamenti nonostante la cache, quindi invia un GET condizionale, quindi se il file non viene modificato ottieni 304 (ignorando i bachi Apache). CTRL + F5 dice di fare un GET completo - anche se hai un file nella tua cache ed è ancora valido quindi non dovresti mai ottenere un 304. CTRL + F5 è utile quando ritieni che la cache sia sbagliata (es. Hai ripristinato un file precedente versione sul server, quindi nonostante l'ultima modifica non è presente dopo aver ancora scaricato il download). –
Perché preoccuparsi di rinfrescarsi se si sa che non sarà diverso? :-) Immagino che tu stia pensando allo scenario in cui la pagina HTML potrebbe essere diversa (e assumiamo che non siano memorizzate nella cache) ma le immagini non saranno diverse (e saranno memorizzate nella cache) quindi preferiresti semplicemente scaricare il pagina HTML? Beh, non è così che funziona: F5 significa "Controlla tutto per vedere cosa, se mai, ha bisogno di essere rinfrescante". Suppongo che i browser possano implementare una versione leggera (ad esempio Alt-F5) per significare "Aggiorna solo risorse scadute" in modo simile quando si naviga nuovamente su quella pagina, ma probabilmente più confuso di quanto valga la pena di avere 3 tipi di aggiornamento. –