Stai facendo debug di una chiamata API e il tuo client HTTP restituisce 419. Controlli il registro ufficiale IANA — non c’è. Cerchi su MDN — niente. Cos’è l’HTTP 419 e perché il tuo server lo sta inviando?
La risposta breve
HTTP 419 non è un codice di stato HTTP ufficiale. Non è mai stato definito in alcuna RFC né registrato presso IANA. È un codice di stato personalizzato usato da framework specifici — in particolare Laravel (PHP) — per indicare che un token CSRF è scaduto o mancante.
Se stai vedendo 419, la tua richiesta:
- Non includeva affatto un token CSRF, oppure
- Includeva un token CSRF scaduto (il predefinito di Laravel è 120 minuti), oppure
- Il cookie di sessione è andato perso tra le richieste
Da dove viene HTTP 419
Laravel definisce questo codice di stato nel suo exception handler. Quando una richiesta POST, PUT, PATCH o DELETE raggiunge una rotta protetta dal middleware VerifyCsrfToken e il token non è valido, Laravel risponde con:
HTTP/1.1 419 Page Expired
Il testo “Page Expired” è la frase di ragione predefinita di Laravel per 419. Non sta descrivendo una pagina — sta descrivendo lo stato della sessione a cui il token CSRF della pagina era legato.
Come risolvere HTTP 419
Se stai costruendo un’app Laravel
Per i form del browser (rendering tradizionale):
La causa più comune è un timeout della sessione. L’utente apre un form, si allontana per due ore e invia. Il token CSRF era valido quando la pagina si è caricata ma la sessione è scaduta da allora.
Soluzioni:
- Estendi la durata della sessione in
config/session.php:
// Il predefinito è 120 minuti
'lifetime' => 480, // 8 ore
- Aggiungi l’aggiornamento del token lato client — al caricamento della pagina, fai una richiesta AJAX leggera per ottenere un token CSRF fresco:
<meta name="csrf-token" content="{{ csrf_token() }}">
// Aggiorna il token ogni 30 minuti
setInterval(() => {
fetch('/api/csrf-token', {
headers: { 'X-Requested-With': 'XMLHttpRequest' }
}).then(r => r.json()).then(data => {
document.querySelector('meta[name="csrf-token"]').content = data.token;
});
}, 30 * 60 * 1000);
- Gestisci 419 con grazia lato client — cattura la risposta 419 e reindirizza al login o ricarica la pagina:
fetch('/api/save', { method: 'POST', body: formData })
.then(response => {
if (response.status === 419) {
// Sessione scaduta — ricarica per ottenere token fresco
window.location.reload();
}
return response.json();
});
Se stai consumando un’API Laravel
Se stai chiamando un’API Laravel da un’app mobile, SPA o servizio esterno e ricevi 419:
-
Controlla la gestione della sessione/cookie. L’API potrebbe aspettare cookie di sessione. Assicurati che il tuo client HTTP invii e riceva cookie.
-
Usa l’autenticazione basata su token invece. Per i consumatori di API, i token di Laravel Sanctum o Laravel Passport non hanno lo stesso problema di scadenza del CSRF. Usa le intestazioni
Authorization: Bearer <token>invece dei cookie di sessione. -
Riautenticati. Se la sessione è scaduta, l’unica soluzione è accedere di nuovo e ottenere una sessione fresca.
Se sei DevOps / infrastruttura
Se stai vedendo 419 nei log del tuo load balancer o API gateway:
- Controlla se il backend è Laravel. 419 è quasi sempre CSRF di Laravel.
- Controlla l’archivio della sessione. Se Redis o l’archivio sessioni basato su file è pieno o mal configurato, le sessioni potrebbero scadere prematuramente.
- Controlla la sincronizzazione degli orologi. Se i tuoi server applicativi hanno orologi sfalsati, i calcoli di scadenza della sessione potrebbero essere errati.
Come controllare i codici di stato HTTP
Se stai facendo debug delle risposte API e devi cercare rapidamente cosa significa un codice di stato, puoi usare uno strumento di riferimento. Il nostro riferimento codici di stato HTTP ha tutti i 63 codici ufficiali con descrizioni e ricerca.
Codici di stato correlati | Codice | Significato | Relazione | |––––|———––|———–| | 401 | Non autorizzato | Token di autenticazione mancante o non valido | | 403 | Vietato | Autenticato ma non autorizzato | | 408 | Timeout della richiesta | Il server è andato in timeout aspettando la richiesta | | 419 | Pagina scaduta | Token CSRF scaduto (specifico di Laravel) | | 440 | Timeout di login | Altra variante specifica del framework | | 503 | Servizio non disponibile | Il server è giù o sovraccarico |
In sintesi
HTTP 419 è Laravel che ti dice “la tua sessione è scaduta, non posso fidarmi di questa richiesta”. Non è un bug — è una funzionalità di sicurezza che funziona come progettato. La soluzione è estendere la durata della sessione, aggiornare i token lato client o passare ai token API per l’accesso programmatico.