← Blog

Next.js I metadati non si aggiornano? Ecco perché

Aggiorna generateMetadata, ridistribuisci e il vecchio titolo o immagine viene ancora visualizzato quando condividi il collegamento. Ecco come determinare se si tratta di un livello di memorizzazione nella cache o di un errore di codice.

Non sei sicuro che sia il tuo codice o una cache?

Controllalo gratuitamente con Proovd. Mostra esattamente quali metadati il ​​tuo URL live sta servendo in questo momento, indipendentemente dalla cache di qualsiasi piattaforma.

Risposta rapida

  • Nella maggior parte dei casi si tratta della cache dati di Next.js o di una cache CDN che serve HTML obsoleto, non un bug del codice
  • generateMetadata in un componente server viene eseguito nuovamente solo quando la cache di recupero sottostante viene riconvalidata
  • Il resto è solitamente la cache della piattaforma (Facebook, LinkedIn, ecc.), non Next.js. Controllali entrambi prima di dare per scontato uno dei due

Esempio riproducibile

Sembra corretto ma continuerà a fornire metadati non aggiornati dopo una modifica del contenuto:

export async function generateMetadata({ params }) {
  const post = await fetch(`https://api.example.com/posts/${params.slug}`).then(r => r.json());

  return {
    title: post.title,
    openGraph: {
      images: [post.image],
    },
  };
}

La chiamata fetch qui viene memorizzata nella cache dalla cache dati di Next.js per impostazione predefinita. Se post.title o post.image cambia nel tuo CMS, questa funzione non vedrà il nuovo valore finché la cache non viene riconvalidata. Senza una strategia esplicita, ciò può significare non prima della prossima costruzione completa.

Perché i tuoi metadati non si aggiornano

Il recupero sottostante viene memorizzato nella cache

Per impostazione predefinita, fetch() all'interno di generateMetadata viene memorizzato nella cache a tempo indeterminato nell'App Router. Risolvi il problema impostando una finestra di riconvalida esplicita:

const post = await fetch(url, { next: { revalidate: 60 } }).then(r => r.json());

Oppure disattiva completamente la memorizzazione nella cache per quella richiesta:

const post = await fetch(url, { cache: "no-store" }).then(r => r.json());

Il percorso è generato staticamente

Se il percorso utilizza generateStaticParams senza riconvalida configurata, l'intero percorso, metadati inclusi, viene integrato in fase di compilazione. L'aggiunta di export const revalidate = 3600; a livello di pagina forza la rigenerazione periodica.

Una CDN o una cache edge serve il vecchio HTML

Anche se la tua build è corretta, Edge Network di Vercel, Cloudflare o un altro CDN davanti alla tua app può fornire una risposta HTML memorizzata nella cache che precede la correzione. Controlla le intestazioni delle risposte:

curl -I https://yoursite.com/blog/post-slug

Cerca x-vercel-cache: HIT o un'intestazione simile CDN. Un HIT significa che stai guardando una copia memorizzata nella cache, non la tua ultima distribuzione.

opengraph-image.ts non raccoglie nuovi dati

Se stai utilizzando la convenzione opengraph-image.ts basata su file, Next.js genera un'immagine statica in fase di creazione per impostazione predefinita. Il contenuto dinamico al suo interno è soggetto alle stesse regole di memorizzazione nella cache di qualsiasi altro componente server, quindi aggiungi una riconvalida esplicita se deve rimanere aggiornato.

In realtà è la cache della piattaforma, non la tua

Il falso allarme più comune. La tua app può fornire metadati perfettamente aggiornati mentre Facebook, LinkedIn o Slack mostrano ancora un'anteprima memorizzata nella cache giorni fa. Conferma ciò che il tuo server sta inviando prima di toccare qualsiasi codice Next.js. Consulta la nostra guida per svuotare la cache degli OG su ogni piattaforma.

Guida alla risoluzione passo passo

  1. Esegui curl -s https://yoursite.com/page | grep -i "og:" per vedere cosa invia effettivamente il tuo server
  2. Verifica la presenza di un'intestazione CDN cache HIT con curl -I https://yoursite.com/page
  3. Aggiungi revalidate o cache esplicito: "no-store" ai recuperi all'interno di generateMetadata
  4. Forza una nuova distribuzione per escludere una cache di build obsoleta
  5. Verifica il risultato live con Proovd

Next.js rispetto ad altri framework

Framework Common cause Fix pattern
Next.js (App Router) Cached fetch inside generateMetadata, or static build with no ISR revalidate option or cache: "no-store"
Astro Client-only meta tag injection instead of static frontmatter/SSR Move tags into the page's static output
SvelteKit Meta tags set only client-side, not in the server load function Load meta values server-side, pass to the head

Elenco di controllo per la correzione rapida

  1. L'output HTML non elaborato confermato ha i tag corretti (non solo il DOM del browser)
  2. Aggiunto riconvalida o cache esplicita: "no-store" per i recuperi all'interno di generateMetadata
  3. Controllate le intestazioni della cache CDN/edge per un HIT obsoleto
  4. Confermato se il percorso è completamente statico senza ISR
  5. Escluso che la vera causa sia la cache della piattaforma social
  6. Verificato l'output live finale con Proovd

Domande frequenti

Perché il mio og:image si aggiorna nel browser ma non su Facebook o LinkedIn?

Probabilmente la tua app Next.js sta già fornendo il tag corretto. La piattaforma mostra una copia memorizzata nella cache prima della correzione. Utilizza lo strumento di aggiornamento della cache della piattaforma anziché modificare più codice.

La riconvalida: 0 disabilita completamente la memorizzazione nella cache?

L'impostazione revalidate: 0 forza effettivamente il rendering dinamico per quel recupero su ogni richiesta, in modo simile a cache: "no-store". Usatelo con parsimonia poiché elimina il vantaggio in termini di prestazioni della memorizzazione nella cache.

Conferma cosa sta effettivamente servendo la tua Next.js app

Controlla gratuitamente i tuoi metadati live con Proovd. Mostra esattamente cosa c'è nel tuo HTML in questo momento, indipendentemente dalla cache di qualsiasi piattaforma.