Gestisci il comportamento della cache

Firebase Hosting utilizza una potente rete CDN globale per rendere il tuo sito il più veloce possibile.

Tutti i contenuti statici richiesti vengono memorizzati automaticamente nella cache della CDN. Se riesegui il deployment dei contenuti del tuo sito, Firebase Hosting cancella automaticamente tutti i tuoi contenuti memorizzati nella cache della CDN fino alla richiesta successiva.

Tuttavia, poiché i servizi Cloud Functions e Cloud Run generano contenuti in modo dinamico, i contenuti di un determinato URL possono variare in base a fattori quali l'input dell'utente o la sua identità. Per tenere conto di questo, le richieste gestite dal codice di backend non vengono memorizzate nella cache della CDN per impostazione predefinita.

Tuttavia, puoi configurare il comportamento di memorizzazione nella cache per i contenuti dinamici. Ad esempio, se una funzione genera nuovi contenuti solo periodicamente, puoi velocizzare la tua app memorizzando nella cache i contenuti generati per almeno un breve periodo di tempo.

Allo stesso modo, puoi configurare il comportamento di memorizzazione nella cache per ridurre potenzialmente i costi di esecuzione delle funzioni, perché i contenuti vengono pubblicati dalla CDN anziché da una funzione attivata. Scopri di più sull'ottimizzazione dell'esecuzione delle funzioni e dei servizi nella Cloud Functions e Cloud Run documentazione.

L'eccezione sono le richieste che restituiscono errori 404. La CDN memorizza nella cache la risposta 404 del tuo servizio a un URL inesistente per 10 minuti, in modo che le richieste successive per quell'URL vengano pubblicate dalla CDN. Se modifichi il servizio in modo che i contenuti esistano ora in questo URL, la CDN continua a pubblicare eventuali 404 memorizzati nella cache per un massimo di 10 minuti, quindi pubblica normalmente i contenuti da quell'URL.

Se una risposta 404 contiene già intestazioni di memorizzazione nella cache impostate dal tuo Cloud Functions o Cloud Run servizio, queste sostituiscono il valore predefinito di 10 minuti e determinano completamente il comportamento di memorizzazione nella cache del la CDN.

Scopri di più sul comportamento di memorizzazione nella cache nella documentazione per gli sviluppatori web di Google.

Impostare Cache-Control

Lo strumento principale che utilizzi per gestire la cache per i contenuti dinamici è l'intestazione Cache-Control. Configurando questa intestazione, puoi comunicare sia al browser sia alla CDN per quanto tempo i tuoi contenuti possono essere memorizzati nella cache. Nella funzione, imposta Cache-Control nel seguente modo:

res.set('Cache-Control', 'public, max-age=300, s-maxage=600');

In questo esempio di intestazione, le direttive eseguono tre operazioni:

  • public : contrassegna la risposta come public. Ciò significa che sia il browser sia le cache intermedie (inclusa la CDN per Firebase Hosting) possono memorizzare i contenuti nella cache.

  • max-age : imposta il numero di secondi di validità di una risposta prima che venga riconvalidata con il server di origine. Questo si applica ai browser; se non è presente un'intestazione s-maxage, si applica anche a tutte le altre cache (inclusa la CDN).

  • s-maxage : sostituisce la direttiva max-age per le cache condivise (come la CDN). Quando la CDN trova una risposta più vecchia di s-maxage secondi, la riconvalida con il server di origine. Nell'intestazione di esempio, i browser possono memorizzare la risposta nella cache per 5 minuti, ma la CDN e qualsiasi altra cache intermedia possono memorizzarla nella cache per 10 minuti.

Per max-age e s-maxage, imposta i valori sul periodo di tempo più lungo per cui gli utenti possono ricevere contenuti scaduti. Se una pagina cambia ogni pochi secondi, utilizza un valore di tempo ridotto. Tuttavia, altri tipi di contenuti possono essere memorizzati nella cache in modo sicuro per ore, giorni o persino mesi.

Se vuoi impedire completamente la memorizzazione nella cache (ad esempio, per pubblicare sempre la versione più recente dei contenuti statici), puoi configurarla in firebase.json utilizzando l'impostazione headers:

"hosting": {
  // ...

  // Disables caching for the /posts route
  "headers": [ {
    // Change source to match your dynamically-rendered routes
    "source": "/posts/**",
    "headers": [ {
      "key": "Cache-Control",
      "value": "no-cache, no-store"
    } ]
  } ]
}

Puoi scoprire di più sull'intestazione Cache-Control su Mozilla Developer Network e nella documentazione per gli sviluppatori web di Google.

Quando vengono pubblicati i contenuti memorizzati nella cache?

Il browser e la CDN memorizzano i contenuti nella cache in base a:

  • Il nome host
  • Il percorso
  • La stringa di query
  • Il contenuto delle intestazioni della richiesta specificate nell'intestazione Vary

Intestazioni Vary

L' Varyintestazione determina quali intestazioni della richiesta devono essere utilizzate per fornire una risposta appropriata (se i contenuti memorizzati nella cache sono validi o se i contenuti devono essere riconvalidati con il server di origine).

Firebase Hosting imposta automaticamente un'intestazione Vary appropriata nella risposta per le situazioni comuni. Nella maggior parte dei casi, non devi preoccuparti dell'intestazione Vary header. Tuttavia, in alcuni casi d'uso avanzati, potresti avere altre intestazioni che devono influire sulla cache. In questo caso, puoi impostare l'intestazione Vary nella risposta. Ad esempio:

res.set('Vary', 'Accept-Encoding, X-My-Custom-Header');

In questo caso, il valore dell'intestazione Vary è:

vary: X-My-Custom-Header, x-fh-requested-host, accept-encoding, cookie, authorization

Con queste impostazioni, due richieste altrimenti identiche con intestazioni X-My-Custom-Header diverse vengono memorizzate nella cache separatamente. Tieni presente che Hosting aggiunge Cookie e Authorization all'intestazione Vary per impostazione predefinita quando viene effettuata una richiesta di contenuti dinamici. In questo modo, qualsiasi intestazione di autorizzazione di sessione o cookie utilizzata viene inclusa nella chiave della cache, il che impedisce perdite accidentali di contenuti.

Tieni presente anche che:

  • È possibile memorizzare nella cache solo le richieste GET e HEAD. Le richieste HTTPS che utilizzano altri metodi non vengono mai memorizzate nella cache.

  • Fai attenzione quando aggiungi impostazioni all'intestazione Vary. Più impostazioni aggiungi, meno è probabile che la CDN possa pubblicare contenuti memorizzati nella cache. Ricorda inoltre che Vary si basa sulle intestazioni della richiesta, non sulle intestazioni della risposta.

Utilizzare i cookie

Quando utilizzi Firebase Hosting insieme a Cloud Functions o Cloud Run, i cookie vengono generalmente rimossi dalle richieste in entrata. Ciò è necessario per consentire un comportamento efficiente della cache della CDN . Solo il cookie __session con un nome speciale può essere trasmesso all'esecuzione dell'app.

Quando è presente, il cookie __session viene automaticamente incluso nella chiave della cache, il che significa che è impossibile che due utenti con cookie diversi ricevano la risposta memorizzata nella cache dell'altro. Utilizza il cookie __session solo se la tua app pubblica contenuti diversi a seconda dell'autorizzazione dell'utente.