405 Method Not Allowed
Uso
Cuando llega un error 405 Method Not Allowed, el cliente entiende que el recurso existe pero que el método especificado no está permitido. Como parte de la respuesta, el servidor envía una cabecera Allow que enumera los métodos admitidos actualmente para ese recurso.
Impacto en SEO
Los motores de búsqueda como Google no indexan una URL que devuelve un estado 405. Las URL indexadas anteriormente que devuelven este código de estado se eliminan de los resultados de búsqueda.
Ejemplo
El cliente intenta aplicar DELETE a un recurso de solo lectura. El servidor responde con 405 Method Not Allowed e incluye la cabecera Allow indicando que solo se permiten GET, HEAD y OPTIONS.
Solicitud
DELETE /policies.pdf HTTP/1.1
Host: example.com
Respuesta
HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS
Content-Type: text/html
Content-Length: 157
<html>
<head>
<title>Operation Not Permitted</title>
</head>
<body>
<p>This resource is read-only and cannot be
deleted.</p>
</body>
</html>
Cómo solucionarlo
Un 405 Method Not Allowed significa que el recurso existe pero no admite el método HTTP empleado en la solicitud.
Compruebe la cabecera Allow de la respuesta. El servidor incluye esta cabecera con todos los métodos permitidos para el recurso. Cambie a uno de los métodos indicados. Inspeccione la cabecera con curl -I
Cambie al método correcto. Un error habitual es enviar POST a un punto de acceso de solo lectura o GET a un punto de acceso de envío. Haga coincidir el método con la operación descrita en la documentación de la API. Los envíos de formularios usan GET de forma predeterminada salvo que el atributo method se fije en post.
Verifique la documentación del punto de acceso de la API. Las API REST definen métodos concretos para cada ruta de recurso. Confirme que la combinación de ruta y método es válida. En muchos frameworks, una diferencia de barra final entre /api/users y /api/users/ enruta a manejadores distintos, y una ruta acepta el método mientras que la otra no.
Revise la configuración del servidor en busca de restricciones de método. Las directivas del servidor web restringen los métodos permitidos por location. En Apache, los bloques
<LimitExcept GET HEAD OPTIONS>
Require all denied
</LimitExcept>
En nginx, la directiva limit_except logra lo mismo:
location /api {
limit_except GET POST {
deny all;
}
}
Ajuste estas directivas para permitir el método previsto.
Gestione las solicitudes de comprobación previa (preflight) de CORS. Las solicitudes entre orígenes desencadenan una comprobación previa con OPTIONS antes del método real. El servidor debe responder a OPTIONS con la cabecera Access-Control-Allow-Methods correcta, que enumere los métodos permitidos. Una configuración de CORS ausente o incompleta devuelve 405 en la comprobación previa. En nginx:
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
Revise el enrutamiento del framework de la aplicación. Los frameworks web (Django, Rails, Express, Spring) solo registran rutas para los métodos declarados explícitamente. La falta de un decorador de ruta o de una acción de controlador para el método solicitado produce un 405. Confirme que la definición de la ruta coincide con el método HTTP previsto.
Compruebe si interfiere el servidor de archivos estáticos. nginx sirve archivos estáticos de forma predeterminada y rechaza las solicitudes POST a recursos estáticos. Cuando el POST está destinado al backend de la aplicación, verifique que el bloque location enruta la solicitud a la aplicación upstream en lugar de al manejador de archivos estáticos.
Referencias de código
.NET
HttpStatusCode.MethodNotAllowed
Rust
http::StatusCode::METHOD_NOT_ALLOWED
Rails
:method_not_allowed
Go
http.StatusMethodNotAllowed
Symfony
Response::HTTP_METHOD_NOT_ALLOWED
Python3.5+
http.HTTPStatus.METHOD_NOT_ALLOWED
Java
java.net.HttpURLConnection.HTTP_BAD_METHOD
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_METHOD_NOT_ALLOWED
Angular
@angular/common/http/HttpStatusCode.MethodNotAllowed