Next.js I metadati non si aggiornano? Ecco perché
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
- Esegui
curl -s https://yoursite.com/page | grep -i "og:"per vedere cosa invia effettivamente il tuo server - Verifica la presenza di un'intestazione CDN cache
HITconcurl -I https://yoursite.com/page - Aggiungi
revalidateocache esplicito: "no-store"ai recuperi all'interno digenerateMetadata - Forza una nuova distribuzione per escludere una cache di build obsoleta
- 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
- L'output HTML non elaborato confermato ha i tag corretti (non solo il DOM del browser)
- Aggiunto riconvalida o cache esplicita: "no-store" per i recuperi all'interno di generateMetadata
- Controllate le intestazioni della cache CDN/edge per un HIT obsoleto
- Confermato se il percorso è completamente statico senza ISR
- Escluso che la vera causa sia la cache della piattaforma social
- 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.
Articoli correlati
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.