Come risolvere gli errori 404 dopo il deploy di un sito o di un'app
Se la tua app funziona in locale ma le pagine danno 404 dopo il deploy, la causa più comune è la mancanza del routing per app a pagina singola (SPA): il server cerca un file chiamato /dashboard che non esiste, perché quella rotta esiste solo in JavaScript. La soluzione è una regola di fallback che serve index.html per le rotte dell'app. Altre cause sono file mancanti nell'output di build, percorsi case-sensitive, differenze negli slash finali, un base path errato e route API mai distribuite.
Inizia annotando esattamente quale URL dà 404 e come ci sei arrivato. Il modello indica subito la causa.
Passo 1: individua il modello
| Cosa vedi | Causa più probabile | Vai a |
|---|---|---|
| La home funziona; i link cliccati funzionano; il ricaricamento o un link diretto dà 404 | Nessun fallback SPA | Passo 2 |
| Tutte le pagine danno 404, inclusa la home | Cartella sbagliata pubblicata, o build non distribuita | Passo 3 |
| Le pagine si caricano, ma immagini, font o script danno 404 | File mancanti nella build, o percorsi errati | Passo 4 |
Funziona con /about/, non con /about (o viceversa) | Gestione dello slash finale | Passo 5 |
/About non funziona ma /about sì | Server case-sensitive | Passo 4 |
La pagina si carica, ma le chiamate dati a /api/... danno 404 | API non distribuita o non instradata | Passo 6 |
| Vecchi URL di un sito precedente danno 404 | Redirect mancanti | Passo 7 |
| Solo su un dominio personalizzato | Configurazione DNS o dominio | Passo 8 |
Per vedere il vero codice di stato, apri gli strumenti per sviluppatori (clic destro → Ispeziona), vai alla scheda Rete (Network), ricarica e guarda lo stato della prima richiesta.
Passo 2: aggiungi il fallback SPA
È il caso classico. In un'app a pagina singola con React, Vue o Svelte, il server ha solo pochi file reali: index.html e alcuni file JavaScript e CSS. Le rotte come /dashboard o /projects/42 sono gestite da un router nel browser.
- Cliccare un link funziona: il router cambia l'URL e disegna la nuova pagina senza chiedere nulla al server.
- Ricaricare o aprire un link direttamente fallisce: il browser chiede al server
/dashboard, il server non ha quel file e risponde 404.
La soluzione è una regola che dice: se la richiesta non corrisponde a un file reale, servi index.html con stato 200 e lascia il controllo al router. Come la aggiungi dipende dall'host (controlla la documentazione attuale del tuo host, perché i dettagli cambiano):
| Host | Regola di fallback tipica |
|---|---|
| Netlify | Un file _redirects nella cartella pubblicata con /* /index.html 200 |
| Vercel | Una rewrite in vercel.json da tutti i percorsi verso /index.html (i preset dei framework spesso lo gestiscono) |
| Cloudflare Pages | Serve un fallback in stile SPA per impostazione predefinita, se non c'è un 404.html al livello principale |
| Nginx | try_files $uri $uri/ /index.html; nel blocco location / |
| Apache | Una regola di rewrite in .htaccess che invia le richieste non-file a index.html |
| GitHub Pages | Nessuna rewrite lato server; le soluzioni alternative comuni sono il routing con hash o un 404.html che reindirizza |
Assicurati che la regola non inghiotta i file reali: le richieste per /assets/app.js devono ancora restituire il file JavaScript. Se restituiscono index.html, ottieni una pagina bianca con l'errore "Failed to load module script". Vedi come risolvere una pagina bianca.
Dai anche al router una rotta catch-all, così gli URL che non corrispondono a nessuna pagina mostrano un messaggio "Pagina non trovata" gentile invece di niente.
Se non puoi cambiare le impostazioni del server, il routing con hash (URL come /#/dashboard) evita il problema, perché la parte dopo # non viene mai inviata al server. È un ripiego, non la prima scelta: gli URL sono meno belli e meno amichevoli per i motori di ricerca.
I framework che generano le pagine sul server o al momento della build (Next.js, Astro e simili) di solito hanno file reali o route server per ogni pagina, quindi questo problema è meno comune lì. Il loro equivalente è una pagina che non è stata generata al momento della build.
Passo 3: verifica cosa è stato davvero distribuito
Se tutto dà 404, probabilmente il server non sta servendo la tua app compilata.
- La cartella giusta. L'host deve pubblicare l'output di build (di solito
distper Vite,buildper Create React App,outper un export statico di Next.js), non la radice del progetto. - La build è andata a buon fine. Leggi il log del deploy. Se la build è fallita, l'host potrebbe non aver distribuito nulla, o una versione vecchia.
index.htmlè al livello principale della cartella pubblicata, non in una sottocartella.- Il base path corrisponde. Se l'app è servita da
esempio.com/app/, deve essere compilata con quel base (l'opzionebasedi Vite,basenamedi React Router), altrimenti ogni rotta e ogni asset mancano.
Passo 4: correggi file mancanti e percorsi errati
Quando le pagine si caricano ma gli asset danno 404:
- Maiuscole e minuscole. macOS e Windows di solito trattano
Logo.pngelogo.pngcome lo stesso file. La maggior parte dei server Linux no. Fai corrispondere ogni riferimento al nome esatto del file. - File fuori dalla build. In Vite, i file in
public/vengono copiati così come sono e referenziati dalla radice (/logo.png). I file importati nel codice vengono inclusi nel bundle. Un file collocato altrove nel progetto potrebbe non essere distribuito affatto. - Percorsi relativi.
images/photo.jpgviene risolto relativamente all'URL corrente, quindi si rompe su/blog/post-1. Usa/images/photo.jpg. - File caricati salvati sul disco locale. Se i caricamenti degli utenti sono stati scritti nella cartella del server, scompaiono quando si distribuisce una nuova versione. Usa un archivio file adeguato.
Passo 5: gestisci in modo coerente gli slash finali
/about e /about/ sono URL diversi. Gli host differiscono nel fatto di aggiungere o rimuovere lo slash, e una mancata corrispondenza con i tuoi link o con il router può produrre 404 o cicli di redirect. Scegli uno stile, fai in modo che i link lo usino, e configura l'host per reindirizzare l'altra forma verso di esso. La coerenza aiuta anche i motori di ricerca, che altrimenti potrebbero vedere due copie di ogni pagina.
Passo 6: correggi le route API che danno 404
Se la pagina si carica ma la scheda Rete mostra richieste /api/... con 404:
- Il back end non è distribuito. Un host statico serve solo file; un back end deve girare da qualche parte.
- Il percorso è instradato in modo diverso in produzione. In sviluppo, un proxy può aver inoltrato
/apia un server separato. In produzione, l'host ha bisogno di una rewrite equivalente, oppure il front end deve chiamare l'indirizzo reale dell'API. - Il fallback SPA ha catturato la richiesta. Una richiesta API che restituisce
index.htmlcon stato 200 significa che la regola di fallback è troppo ampia. Escludi/api/*da essa.
Le richieste dell'app pubblicata a /api/orders danno 404, ma nell'anteprima funzionano. Controlla come viene instradato /api nell'anteprima e nell'app pubblicata, e fai in modo che il front end pubblicato raggiunga il back end nello stesso modo.
Passo 7: reindirizza i vecchi URL
Se hai cambiato piattaforma o ristrutturato il sito, i vecchi URL ancora usati da persone e motori di ricerca daranno 404. Aggiungi un redirect 301 (permanente) da ogni vecchio URL alla sua nuova posizione. Tieni un elenco e verificane un campione dopo il lancio. La nostra guida su come migrare un sito WordPress spiega come costruire quell'elenco.
Passo 8: verifica il dominio
Se l'app funziona all'indirizzo dell'host ma dà 404 sul tuo dominio personalizzato, il dominio potrebbe puntare al progetto sbagliato, oppure l'host potrebbe non avere ancora collegato il dominio al tuo sito. Controlla i record DNS e le impostazioni dei domini dell'host. Vedi come collegare un dominio personalizzato.
Rendi utile la pagina 404 reale
Alcuni 404 sono corretti: qualcuno ha digitato male un URL. Rendi quella pagina utile:
- Un breve messaggio e un link alla home e alle sezioni principali
- Una casella di ricerca, se il sito ha la ricerca
- La stessa intestazione e la stessa navigazione del resto del sito
Dove la tua configurazione lo consente, restituisci un codice di stato 404 reale per le pagine che non esistono. Un messaggio "non trovato" restituito con stato 200 è ciò che i motori di ricerca chiamano soft 404, e può sprecare il loro tempo di scansione e confondere l'indicizzazione.
Errori comuni
- Testare solo cliccando. Verifica sempre incollando URL profondi in una nuova scheda e ricaricando.
- Un fallback che cattura tutto. Asset e route API restituiscono
index.html, causando pagine bianche ed errori API confusi. - Maiuscole e minuscole non corrispondenti che si rompono solo sul server.
- Distribuire la cartella dei sorgenti invece dell'output di build.
- Ristrutturare gli URL senza redirect. Ogni vecchio link diventa un 404.
I 404 in Mythex
In Mythex pubblichi dallo spazio di lavoro, e i front end statici vengono distribuiti come siti statici. Se una pagina pubblicata dà 404, fornisci all'agente l'URL esatto, dicendo se succede al ricaricamento o al clic, e cosa mostra la scheda Rete, poi chiedigli di controllare il routing. Ripubblica dopo la correzione, perché l'app live è uno snapshot finché non ripubblichi. Se di recente hai cambiato il progetto e il sito live sembra vecchio, ripubblica e ricarica forzatamente la pagina. Usa Fix with AI nella finestra di pubblicazione se la build fallisce. Vedi Come pubblicare e Risoluzione dei problemi di pubblicazione nella documentazione, e la nostra guida su come fare debug di un'app creata con l'AI.
Checklist per i 404
- Annotato esattamente quali URL danno 404, e se al clic, al ricaricamento o a entrambi
- Il fallback SPA serve
index.htmlper le rotte dell'app, con stato 200 - Il fallback esclude i file reali e
/api/* - Il router ha una rotta catch-all "non trovato"
- La cartella dell'output di build è quella pubblicata, e la build è riuscita
- Il base path corrisponde a dove l'app è servita
- Le maiuscole dei nomi dei file corrispondono a ogni riferimento
- I percorsi degli asset iniziano con
/ - Stile degli slash finali coerente
- Route API distribuite e instradate in produzione
- Redirect 301 per i vecchi URL
- Link profondi testati incollandoli in una nuova scheda
Domande
Perché ricevo un 404 quando ricarico una pagina della mia app React?
In un'app a pagina singola, le rotte come /dashboard esistono solo in JavaScript. Cliccare un link funziona perché il router lo gestisce nel browser, ma un ricaricamento chiede al server un file /dashboard che non esiste. La soluzione è una regola di fallback che serve index.html per le rotte dell'app.
Come aggiungo un fallback SPA su Netlify, Vercel o Nginx?
Su Netlify, aggiungi un file _redirects con /* /index.html 200. Su Vercel, aggiungi una rewrite in vercel.json che invia tutti i percorsi a /index.html. Su Nginx, usa try_files $uri $uri/ /index.html; nel blocco location. Verifica la documentazione del tuo host, perché le regole cambiano.
Perché immagini o file danno 404 dopo il deploy?
Di solito il file non è nell'output di build, la maiuscola del percorso non corrisponde (i server spesso distinguono maiuscole e minuscole dove il tuo portatile no), oppure il percorso è relativo quando dovrebbe iniziare con una barra.
Una pagina mancante deve restituire uno stato 404 reale?
Sì. Mostra una pagina di "non trovato" utile, ma con stato 404 dove la tua configurazione lo consente. I motori di ricerca trattano un messaggio "non trovato" restituito con stato 200 come soft 404, che spreca tempo di scansione e può confondere l'indicizzazione.