Migliorare le prestazioni dei propri siti web

16 dicembre 2011

È importante che almeno una delle due sia impostata, entrambe sono di fatto ridondanti. Expires viene considerata maggiormente supportata dai sistemi di caching, mentre Cache-Control, con tutte le possibili opzioni, offre un controllo maggiore. Nel caso del web server Apache possiamo utilizzare le direttive del modulo mod_expires. Per impostare, ad esempio, la scadenza di un gruppo di file un mese dopo l’accesso:

<FilesMatch "\.(ico|pdf|flv|jpe?g|png|gif|js|css|swf)$">
    ExpiresActive On
    ExpiresDefault "access plus 1 month"
</FilesMatch>

Invece di specificare le estensioni dei file possiamo anche agire sui mime type. Ad esempio, per impostare una scadenza basata sulla data di modifica delle immagini in formato GIF:

ExpiresByType image/gif "modification plus 6 hours 2 minutes" 

Un altro modulo di Apache molto utile per agire sulle intestazioni HTTP è mod_headers:

<FilesMatch "\.(ico|pdf|flv|jpe?g|png|gif|js|css|swf)$">
    Header set Expires "Thu, 15 Apr 2010 20:00:00 GMT"
</FilesMatch>

Vi sono altre due intestazioni, concettualmente simili, che ci permettono di influenzare i meccanismi di caching dei browser: Last-Modified e ETag. Le potete trovare in grassetto nell’esempio iniziale, ma le riporto per facilità di lettura:

Etag: "ddb0427dab362d9fe748aceb32decdf2"
Last-Modified: Sat, 12 Nov 2011 16:42:05 GMT

Entrambe forniscono un sistema che permette al programma di navigazione di controllare se la risorsa salvata localmente sia identica o meno a quella disponibile sul server. La prima, Last-Modified, stabilisce l’ultima data di modifica della risorsa che quindi andrà riscaricata solo se anteriore a quella dichiarata dal server. Su questa possiamo intervenire così:

<FilesMatch "\.(ico|pdf|flv|jpe?g|png|gif|js|css|swf)$">
    Header set last-modified "Thu, 15 Nov 2011 20:00:00 GMT" 
</FilesMatch>

Etag, Entity tag, è invece un valore univoco, generato dal server, che identifica un oggetto: se l’oggetto viene modificato cambia anche il suo etag. In questa situazione il client si limiterà ad inviare al web server delle semplici richieste condizionali If-Modified-Since e If-None-Match che, come è logico aspettarsi, avranno un tempo di latenza notevolmente inferiore rispetto alle richieste complete.

Attenzione però ad un problema legato ad ETag: il valore viene costruito sulla base di alcune caratteristiche del file legate anche all’host su cui è memorizzato. Apache sfrutta l’inode del file, la dimensione e la data di ultima modifica. Nel caso si utilizzino più server per gestire il proprio sito, se il browser preleva la risorsa da uno e poi tenta di validarla su un secondo, ovviamente la verifica fallirà e sarà costretto a riscaricarla. In questo caso otterremo un peggioramento delle prestazioni anzichè un miglioramento, cui si può ovviare disabilitando ETag con la direttiva:

FileETag none

Oppure costruendo un valore che sia il medesimo per tutti i server, ad esempio utilizzando solo la data di modifica e la dimensione del file:

FileETag -INode MTime Size

Il consiglio, in sintesi, è agire sugli header che regolano il caching delle risorse statiche, il che vuol dire non limitarsi alle classiche immagini, ma includere anche fogli di stile, script, file swf e via discorrendo. Non influenzeremo le prestazioni del sito la prima volta che il navigatore visualizzerà le nostre pagine, ma successivamente ridurremo il tempo di risposta anche del 50% o più. Eseguite sempre dei test e valutate anche eventuali controindicazioni delle soluzioni adottate. Un’ultima notazione: da RFC non si dovrebbe impostare oltre l’anno la data di scadenza di una risorsa.

Se vuoi aggiornamenti su Migliorare le prestazioni dei propri siti web inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Migliorare le prestazioni dei propri siti web

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy