HTTP 405 Method Not Allowed: qué significa y cómo solucionarlo
HTTP 405 Method Not Allowed
HTTP 405 Method Not Allowed: causas, cabecera Allow y soluciones | We.Inc
Por qué un servidor responde 405, la cabecera Allow que debe enviar y cómo solucionarlo en Flask, Express y Next.js. Crea la respuesta 405 correcta para tu propia ruta.
Un 405 Method Not Allowed significa que la URL existe pero no acepta el método HTTP que usaste, por ejemplo un POST enviado a una ruta que solo gestiona GET. El servidor debe indicar los métodos que sí acepta en una cabecera Allow. Envía uno de esos, o añade en el servidor un manejador para tu método.
El 405 comparado con sus vecinos
Estado
Significado
Solución habitual
405 Method Not Allowed
El recurso existe; no acepta este método
Usa un método de Allow o añade un manejador
404 Not Found
No hay ningún recurso en esta URL
Corrige la ruta
501 Not Implemented
El servidor no admite el método en absoluto
Usa un método estándar
403 Forbidden
El método es correcto, pero te falta permiso
Consigue acceso o cambia de cuenta
Marca los métodos que gestiona tu ruta, elige el método que envía un cliente, y el generador muestra la respuesta exacta que debería devolver el servidor: un éxito normal, o un 405 con una cabecera Allow que incluye los métodos en el orden en que los marcaste.
Marca cada método que tu ruta gestiona de verdad.
Elige el método que usa la petición que falla. El panel Network de tu navegador lo muestra.
Lee la respuesta. Un 405 debe incluir Allow con cada método que marcaste.
Copia la solución de abajo que corresponda a tu framework.
Revisa primero la cabecera Allow de la respuesta que falla. Te dice qué métodos aceptará el servidor, lo que a menudo revela un formulario que usa el equivocado.
Un formulario sin atributo method se envía con GET. Si tu manejador solo acepta POST, añade method="post" al formulario.
Una barra final o una redirección pueden convertir un POST en un GET por el camino, que luego llega a una ruta que solo acepta POST. Revisa cada salto en el panel Network.
Cuando escribas el servidor, devuelve 405 con Allow en lugar de 404 para una ruta conocida con el método equivocado. Así los clientes y las herramientas de API pueden explicar el error.
Preguntas frecuentes
¿El 405 es un problema del cliente o del servidor?
Es un código 4xx, así que lo que el servidor rechaza es la petición. O el cliente debe usar otro método, o el responsable del servidor debe añadir soporte para el que se está enviando.
¿Una respuesta 405 tiene que incluir la cabecera Allow?
Sí. RFC 9110 dice que el servidor debe generar un campo de cabecera Allow con los métodos que el recurso admite en ese momento. Se permite una lista vacía cuando el recurso no acepta ningún método.
¿Por qué recibo un 405 al enviar un formulario?
Normalmente el formulario envía un método que la ruta no acepta. Una ruta en Flask, por ejemplo, solo responde a GET hasta que pasas methods=["GET", "POST"] al decorador de la ruta.
¿Por qué Express me da 404 en lugar de 405?
Express trata igual un método y una ruta que no coinciden: ninguna ruta respondió, así que la petición acaba en el manejador de 404. Añade una captura para la ruta con app.all para enviar tú mismo el 405.
¿Qué diferencia hay entre 405 y 501?
405 significa que este recurso rechaza un método que el servidor entiende. 501 significa que el servidor no admite el método para ningún recurso.
La regla de la especificación
El servidor de origen reconoce el método, pero el recurso de destino no lo admite. Como el servidor sabe qué métodos funcionarían, la especificación le obliga a indicarlo mediante Allow. Un 405 sin Allow está incompleto.
De dónde suele venir un 405
Las rutas de un framework registradas para un solo método, los API gateways que asignan cada método por separado y los servidores de archivos estáticos que sirven archivos pero no aceptan escrituras son los orígenes habituales. En todos los casos la ruta coincidió y el método no.
Los route handlers de Next.js exportan una función por método. Los nombres admitidos son GET, POST, PUT, PATCH, DELETE, HEAD y OPTIONS, y si no exportas OPTIONS, Next.js lo responde por ti con una cabecera Allow construida a partir de los métodos que sí exportaste.
Soluciones por stack
Flask: declara cada método que acepta la ruta
Sin methods=, la ruta solo responde a GET (Flask añade HEAD y OPTIONS automáticamente).
Express: envía un 405 real en lugar de caer en el 404
app.all después de los manejadores reales captura cualquier otro método para la misma ruta.
Route handler de Next.js: exporta el método que invocas
app/api/items/route.ts. Una petición con un método que no exportaste no puede llegar a tu código.
HTML: dale al formulario el método que espera el servidor
Un formulario sin atributo method se envía como GET.
Generador de respuestas 405
Métodos que gestiona esta ruta
Método que envía el cliente
Lo que debería devolver el servidor
El método está admitido, así que no hay ningún 405 de por medio.
El método no está en la lista, así que la respuesta es un 405 con una cabecera Allow que nombra los {n} métodos que marcaste.