In questa lunga rassegna di soluzioni tecniche che ho messo in atto per migliorare l’esperienza dei visitatori sul mio blog, ho sempre cercato di generalizzare l’implementazione, affinché sia applicabile a qualsiasi sito, su qualsiasi provider si trovi. Quello che invece racconterò oggi, potrebbe non funzionare se chi ospita le tue pagine non consente di utilizzare il file .htaccess
ed in particolare la direttiva mod_expires
. Ottimizzatore avvisato, mezzo salvato 🙂 Prima di proseguire, forse è utile fare qualche passo indietro per spiegare brevemente come fa una pagina ad arrivare sul tuo schermo, dopo che clicca su un link o si digita un indirizzo nel browser.
Il browser, per ridurre l’attesa, mantiene una copia locale (cache) delle pagine che hai visitato, e di tutti i pezzetti relativi (fogli di stile, immagini, javascript e via dicendo). Allora invia una richiesta al server, nella quale dice più o meno “per favore, dammi il file all’indirizzo tal de tali, solo se è stato modificato dopo [data della copia locale]”. Il server va a spulciare nel disco, confronta la data di ultima modifica della risorsa, e se non è successiva a quella comunicata dal browser, gli risponde “ok, usa la tua copia locale, che è ancora valida”. In gergo tecnico, si dice che gli restituisce un codice 304. Il server può spingersi oltre, e dire al browser “usa la tua risorsa locale per tre mesi da oggi, senza neppure chiedermelo”. Questo approccio, come puoi intuire, consente di non dover inviare richieste per ogni singolo pezzettino che compone la pagina.
Per far dire al server la “cosa dei tre mesi da oggi”, esiste una speciale configurazione di Apache, il cui uso è suggerito anche da strumenti quali Google Page Speed e YSlow. Si tratta di un “modulo” che consente di configurare la scadenza degli oggetti nella cache del browser: non è detto che poi il programma dell’utente onori questo suggerimento, e lasci in pace il server, ma tentar non nuoce. Ecco cosa aggiungere al tuo .htaccess per attivare questa magica opzione:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault "access plus 5 seconds"
ExpiresByType text/css "access plus 3 months"
ExpiresByType text/javascript "access plus 3 months"
ExpiresByType application/x-javascript "access plus 3 months"
ExpiresByType image/gif "access plus 3 months"
ExpiresByType image/jpg "access plus 3 months"
ExpiresByType image/png "access plus 3 months"
</IfModule>
Commenti
Con il nuovo tema sono alla ricerca della perfezione con pagespeed. Purtroppo per via di cavilli non posso raggiungerla (a parer di Google dovremmo avere tutti i 3 livelli su cui mettere le immagini, css per ogni pagina e un server tutto nostro).
Tuttavia volevo risolvere il LeverageBrowserCaching, ma informandomi qua e la sulla rete ho scoperto che sul mio server condiviso non posso inserire la stringa nel mio htaccess, provando la tua stringa, aumento il tempo di caching ma non risolvo questo problema.
Hai qualche dritta?
@Redemption: si, concordo con te che Page Speed è fin troppo esigente per la maggior parte dei comuni mortali. Io ho rinunciato a soddisfare tutti i requisiti, anche perché alcuni rischiano di sovraccaricare il server (vedi compressione gzip) senza di fatto apportare tangibili benefici nell’era della banda larga. In merito allo sfruttare il Browser Caching, se non hai modo di farlo “lato server” via htaccess, puoi sempre provare con i metatag nel codice sorgente della pagina… no?
@camu: servono a poco, la modifica deve essere fatta in htaccess… Ovviamente Aruba alla richiesta mi ha subito piazzato il suo vps 😐
@Redemption: perché non ti sposti su dreamhost? Molti ne parlano così bene 🙂
Ho avuto siti su dreamhost, sono rimasto shockato. Siti anche con 2000 visite al giorno lentissimi, ti rivolgevi al servizio clienti e ti dicevano che avevi ragione, dopo la terza volta che avevi ragione ti regalavano un bonus ma il servizio rimaneva una vera cacca. Dreamhost lo evito come la peste, così come tophost per siti con più di 900 visitatori al giorno.
@Redemption: infatti Tophost non te l’ho neppure citato, nel tuo caso non va bene. In merito a Dreamhost ne avevo sentito parlare bene, ma a quanto pare mi devo ricredere 🙂 Allora forse è il caso di andare verso qualcosa di più flessibile e “costoso”, tipo MediaTemple, che io ho usato per un paio di clienti, e costa circa 200 dollari all’anno.
@camu: Media Temple non lo conosco. Purtroppo quando si parla di server è sempre difficile scegliere, poi dipende molto dal caso. Magari chi si trova bene su dh è perché gli hanno dato anche un server performante, io mi sono trovato male anche con l’organizzatissimo godaddy, che nella fascia economica offre dei server davvero scadenti.
@Redemption: si, godaddy non è granché, confermo 🙂
@Camu, tu hai scritto che con Tophost sono attivi però non notavo miglioramenti. Ho aperto un tcket e mi hanno detto che non sono attivi e non li possono attivare….sono rimasto un po allibito
Risposte al commento di paolo
@paolo: scusa, ma cosa sarebbero attivi? I comandi per il mod_expires? Il plurale che hai usato mi perplime un po’…
Risposte al commento di camu
@camu: …scusa mi riferivo anche al modulo mod_headers oltre a mod_expires…
@camu: ecco la mia richiesta e la loro risposta:
Richiesta di assistenza n. 0180420 effettuata in data 18/02/2011 15:44:07 dal sig. P. G. per il sito www ecc
Vostra richiesta:
Buon giorno
vorrei chiedere se sono attivi i moduli
mod_headers
mod_expires
mod_gzip
Se non fossero attivi vorrei chiedere se fosse possibile attivarli.
Cordiali saluti
PG
Risposta del tecnico del Supporto di Primo Livello:
Gentile Paolo, la ringraziamo per averci contattato.
Purtroppo i moduli non sono attivi e non è possibile attivarli.
Le auguriamo buona giornata.
Risposte al commento di paolo
@paolo: strano, che li abbiano disattivati nel corso del 2010? Farò domani delle prove con Google PageSpeed per vedere se nel mio caso sono ancora attivi… grazie per la precisazione!
@paolo: ho fatto le prove (non potevo aspettare fino a domani eheh) ed entrambi i moduli sono attivi sul mio nodo. Tant’è che se ispezioni gli header HTTP di questa pagina, dovresti vedere un header “duechiacchiere” 😉 Che ho appositamente inserito per fare la prova con mod_headers. Forse non sono attivi su tutti i nodi di Tophost?