Perché un server risponde 405, l'header Allow che deve inviare e come risolvere il problema in Flask, Express e Next.js. Crea la risposta 405 corretta per la tua route.
Un 405 Method Not Allowed significa che l'URL esiste ma non accetta il metodo HTTP che hai usato, per esempio un POST inviato a una route che gestisce solo GET. Il server deve elencare i metodi che accetta in un header Allow. Invia uno di quelli, oppure aggiungi sul server un handler per il tuo metodo.
Il 405 a confronto con i codici vicini
Stato
Significato
Soluzione tipica
405 Method Not Allowed
La risorsa esiste; questo metodo non è accettato per essa
Usa un metodo indicato in Allow, o aggiungi un handler
404 Not Found
Nessuna risorsa a questo URL
Correggi il percorso
501 Not Implemented
Il server non supporta affatto il metodo
Usa un metodo standard
403 Forbidden
Il metodo va bene, ti manca il permesso
Ottieni l'accesso o cambia account
Spunta i metodi che la tua route gestisce, scegli il metodo che invia un client, e il builder mostra la risposta esatta che il server dovrebbe restituire: un normale successo, oppure un 405 con un header Allow che elenca i metodi nell'ordine in cui li hai spuntati.
Spunta ogni metodo che la tua route gestisce davvero.
Scegli il metodo usato dalla richiesta che fallisce. Lo mostra il pannello Network del tuo browser.
Leggi la risposta. Un 405 deve includere Allow con ogni metodo che hai spuntato.
Copia qui sotto la soluzione per lo stack che corrisponde al tuo framework.
Controlla per prima cosa l'header Allow nella risposta che fallisce. Ti dice quali metodi il server accetta, e spesso rivela un form che usa quello sbagliato.
Un form senza attributo method viene inviato con GET. Se il tuo handler accetta solo POST, aggiungi method="post" al form.
Uno slash finale o un redirect possono trasformare un POST in GET lungo il percorso, che poi arriva su una route solo POST. Guarda ogni passaggio nel pannello Network.
Quando scrivi il server, restituisci 405 con Allow invece di 404 per un percorso noto con il metodo sbagliato. Client e strumenti API potranno così spiegare l'errore.
Domande frequenti
Il 405 è un problema del client o del server?
È un codice 4xx, quindi il server contesta la richiesta. O il client deve usare un altro metodo, o chi gestisce il server deve aggiungere il supporto per quello che viene inviato.
Una risposta 405 deve includere l'header Allow?
Sì. La RFC 9110 dice che il server deve generare un campo header Allow che elenca i metodi attualmente supportati dalla risorsa. Un elenco vuoto è ammesso quando la risorsa non accetta nessun metodo.
Perché ricevo un 405 quando invio un form?
Di solito il form invia un metodo che la route non accetta. Una route in Flask, per esempio, risponde solo a GET finché non passi methods=["GET", "POST"] al decorator della route.
Perché Express mi dà 404 invece di 405?
Express tratta allo stesso modo metodo e percorso non corrispondenti: nessuna route ha risposto, quindi la richiesta arriva fino all'handler 404. Aggiungi un catch per il percorso con app.all per inviare tu stesso il 405.
Qual è la differenza tra 405 e 501?
405 significa che questa risorsa rifiuta un metodo che il server conosce. 501 significa che il server non supporta il metodo per nessuna risorsa.
La regola nella specifica
Il metodo è riconosciuto dal server di origine, ma la risorsa di destinazione non lo supporta. Poiché il server sa quali metodi funzionerebbero, la specifica gli impone di dirlo tramite Allow. Un 405 senza Allow è incompleto.
Da dove arriva di solito un 405
Le route dei framework registrate per un solo metodo, gli API gateway che mappano ogni metodo separatamente e i server di file statici che servono file ma non accettano scritture sono le fonti abituali. In ogni caso il percorso corrispondeva e il metodo no.
I route handler di Next.js esportano una funzione per metodo. I nomi supportati sono GET, POST, PUT, PATCH, DELETE, HEAD e OPTIONS, e quando non esporti OPTIONS, Next.js risponde al posto tuo con un header Allow costruito dai metodi che hai esportato.
Soluzioni per stack
Flask: dichiara ogni metodo che la route accetta
Senza methods=, la route risponde solo a GET (Flask aggiunge HEAD e OPTIONS automaticamente).
Express: invia un vero 405 invece di finire nel 404
app.all dopo gli handler reali intercetta ogni altro metodo per lo stesso percorso.
Route handler di Next.js: esporta il metodo che chiami
app/api/items/route.ts. Una richiesta con un metodo che non hai esportato non può raggiungere il tuo codice.
HTML: dai al form il metodo che il server si aspetta
Un form senza attributo method viene inviato come GET.
Builder di risposte 405
Metodi gestiti da questa route
Metodo inviato dal client
Cosa dovrebbe rispondere il server
Il metodo è supportato, quindi non c'è nessun 405.
Il metodo non è nell'elenco, quindi la risposta è 405 con un header Allow che indica i {n} metodi che hai spuntato.