Come configurare le intestazioni Cache-Control in Apache

  • Anthony Heddings
  • July 29, 2020, 11:00am EDT

apache

Il browser di ogni utente fa uso di una cache integrata per memorizzare gli oggetti scaricati, che può accelerare notevolmente le visite ripetute al tuo sito web, caricandolo dal disco piuttosto che dalla rete. Ecco come configurarla in Apache.

Come funziona la cache?

La prima volta che un utente si collega al tuo sito, scaricherà tutte le risorse statiche necessarie per rendere la pagina, comprese cose come il tuo logo. Quando navigano su una nuova pagina, questa caricherà il tuo logo dalla memoria piuttosto che chiederlo di nuovo, accelerando significativamente le prestazioni e riducendo il carico sul tuo server web nel processo.

Questa è una cache lato client, ma molti siti fanno anche uso di una Content Delivery Network, o CDN. Una CDN è una rete di server che si trova di fronte al tuo server web principale, o server “origin”. Questa rete mette in cache le tue pagine, aumentando la tua larghezza di banda massima, riducendo la latenza di accesso, e riducendo notevolmente lo stress posto sul tuo server di origine. Se vuoi saperne di più sui CDN, puoi leggere la nostra guida su di essi qui.

Cache-Control è un’intestazione che puoi configurare il tuo server web per aggiungere a tutte le richieste in uscita, che dirà al browser e ai CDN come mettere in cache i tuoi contenuti.

Pubblicità

Alcune pagine non dovrebbero mai essere messe in cache da cache condivise come i CDN. Così facendo si rischia di mostrare le informazioni personali di un utente ad altri. Come regola generale, se la pagina sarà esattamente la stessa per tutti gli utenti, come la tua home page, puoi metterla in cache. Se mostra informazioni confidenziali dell’utente, vorrete metterla nella lista nera della vostra cache. Le risorse statiche, come i CSS e le immagini, di solito possono essere messe nella cache per tutti, spesso per molto più tempo.

Anche la quantità di tempo che gli oggetti passano nella cache è importante. Chiamato Time-To-Live (TTL), l’età massima delle vostre risorse nella cache determina quanto tempo l’oggetto rimarrà nella cache prima di essere invalidato, e richiedere all’utente un nuovo oggetto. Per le risorse statiche che non cambiano molto, si possono impostare valori TTL molto alti, di solito intorno ai due anni. Per le cose che potresti voler aggiornare, vorrai impostare valori TTL più bassi per evitare che le risorse stantie rimangano nella cache troppo a lungo.

Puoi sempre usare nomi di file in versione per innescare una ricarica della cache. Se si rilascia una nuova versione di un foglio di stile CSS, è possibile nominarlo styles-1.0.1.css, e il browser dell’utente (e qualsiasi CDN di fronte ad esso) lo vedrà come un nuovo file che deve essere riscaricato. Inoltre, per alcuni CDN, è possibile emettere invalidazioni manuali per lavare la cache esistente senza cambiare alcun nome di file.

Come usare Cache-Control in Apache

Cache-Control ha alcune opzioni:

  • public – Può essere messo in cache da chiunque, inclusi browser e CDN. Usalo per la maggior parte degli oggetti statici.
  • private – Contiene dati sensibili che non possono essere messi in cache dai CDN o dai reverse proxy. Il browser dell’utente può memorizzarli nella cache locale. Usalo per la maggior parte delle pagine autenticate.
  • no-cache – Nonostante il nome, non disabilita la cache. Il browser può ancora mettere in cache la risposta per le prestazioni, ma deve controllare con il server di origine gli aggiornamenti prima di usarla. Usalo se vuoi che l’utente riconvalidi ogni volta.
  • no-store – Disabilita completamente la cache. Usalo solo per dati altamente sensibili che non dovrebbero essere inviati due volte.

Inoltre, puoi aggiungere la direttiva no-transform, che disabilita qualsiasi conversione che può essere fatta alla risorsa. Per esempio, alcuni CDN comprimono le immagini per ridurre la larghezza di banda. Questa direttiva disabilita questo comportamento.

In Apache, dovrai impostare questa intestazione manualmente usando la direttiva Header set, così:

Header set Cache-Control "max-age=84600, public"

Il valore max-age è impostato in secondi, per esempio, max-age=300 per un TTL di cinque minuti, e max-age=63072000 per due anni.

Pubblicità

Puoi mettere questa direttiva nella root della tua configurazione per applicarla a tutto il sito, ma un metodo migliore è applicare le impostazioni a seconda del tipo di file. Per esempio, per impostare un TTL elevato per la maggior parte dei media statici, si può usare un blocco FilesMatch:

<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$"> Header set Cache-Control "max-age=63072000, public" </FilesMatch>

Se si vuole inserire un percorso specifico nella lista nera dei CDN, si può usare un blocco Directory:

<Directory "/private"> Header set Cache-Control "max-age=300, private" </Directory> 

o semplicemente abbinare un singolo file:

<File "protected.html"> Header set Cache-Control "max-age=300, private" </File>

I blocchi con le corrispondenze più specifiche avranno la precedenza sulle corrispondenze regex generali, ma vorrete verificare che tutto sia impostato correttamente all’estremità ricevente. Puoi controllare questo dai DevTools di Chrome, sotto Network > Headers.

chrome devtools network tab

Se hai accesso solo alla configurazione .htaccess, puoi ancora usare la corrispondenza delle directory creando un nuovo file .htaccess in ogni sottodirectory.

Utilizzare il Surrogate-Control per modificare direttamente il comportamento del CDN

L’intestazione Surrogate-Control funziona esattamente come Cache-Control, ma dettaglia istruzioni specifiche per CDN e reverse proxy, piuttosto che per gli utenti finali. In questo modo, puoi dire ai CDN di fare una cosa, ma inviare direzioni diverse al browser.

Pubblicità

Dovrai impostare questa intestazione manualmente, nello stesso modo in cui imposti Cache-Control:

Header set Surrogate-Control "max-age=300, public"

Vorrai sicuramente testare con il tuo CDN per verificare che questo funzioni-Surrogate-Control è abbastanza nuovo e non è universale.

Anthony Heddings
Anthony Heddings è l’ingegnere cloud residente per LifeSavvy Media, uno scrittore tecnico, un programmatore e un esperto della piattaforma AWS di Amazon. Ha scritto centinaia di articoli per How-To Geek e CloudSavvy IT che sono stati letti milioni di volte.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.