405 Method Not Allowed: URL correcta, método equivocado

405 Method Not Allowed significa que el servidor conoce el método de la solicitud pero la URL de destino no lo admite; la cabecera Allow indica cuáles sí.

Comprueba el código de estado de una URL

405 Method Not Allowed significa que el servidor conoce el método HTTP que has usado (POST, PUT, DELETE, incluso HEAD) pero esta URL concreta no lo acepta. La página o el endpoint existe; simplemente no admite ese tipo de solicitud.

Definición

La RFC 9110, sección 15.5.6 exige que el servidor incluya una cabecera Allow con los métodos que el recurso sí admite. Compáralo con 501 Not Implemented, que significa que el servidor no admite el método en ningún sitio. La RFC 9110 también dice que todo servidor de propósito general debe admitir GET y HEAD, así que un 405 en cualquiera de ellos es un fallo.

Causas habituales

  • Un formulario envía un POST a una URL cuya ruta solo acepta GET, o el action del formulario apunta a una ruta equivocada.
  • Enviar un POST a un archivo estático: Nginx responde 405 porque un archivo estático no puede recibir un POST.
  • Rutas de la aplicación que no responden a HEAD. Express, Laravel y Flask gestionan HEAD automáticamente en las rutas GET; algunos enrutadores propios no lo hacen.
  • Hostings o WAF que bloquean los métodos PUT, DELETE o WebDAV.

Impacto en el SEO

Googlebot pide las páginas con GET, así que un 405 solo perjudica si se rechaza el propio GET. En ese caso la URL se trata como cualquier otro 4xx y sale del índice, según la documentación de Google. Hay un problema más sutil: si HEAD devuelve 405 mientras GET devuelve 200, los monitores de disponibilidad y los comprobadores de enlaces que dependen de HEAD pueden notificar páginas que funcionan como enlaces rotos. Arregla el soporte de HEAD para que todas las herramientas vean la realidad.

Cómo solucionarlo

// Express: 405 explícito con una cabecera Allow para los demás métodos
app.route('/api/v1/reports')
  .get(listReports)
  .post(createReport)
  .all((req, res) => {
    res.set('Allow', 'GET, HEAD, POST').status(405).json({ error: 'Method not allowed' });
  });

En los formularios, comprueba que el atributo method y la ruta del servidor coinciden. En un sitio estático, envía los formularios a un script o a un servicio de formularios, no a un archivo .html.

Cómo comprobarlo

El comprobador de códigos de estado HTTP confirma lo que devuelve una solicitud normal de página, y el comprobador de cabeceras HTTP muestra las cabeceras completas de la respuesta. Para probar un método concreto, usa curl:

curl -i -X POST https://www.example.com/about.html

HTTP/1.1 405 Not Allowed
Server: nginx
Content-Type: text/html

Nginx escribe su propia frase de motivo, “Not Allowed”; los clientes se guían por el número, así que significa lo mismo que “Method Not Allowed”.

Preguntas frecuentes

¿Cuál es la diferencia entre 405 y 404?

El 404 significa que no existe nada en la URL. El 405 significa que sí existe algo, pero no acepta el método que has usado, como un POST a una página que solo admite GET.

¿Por qué mi formulario de contacto devuelve 405?

Probablemente el formulario envía el POST a una URL que solo acepta GET, a menudo una página HTML estática o una ruta definida solo para GET. Apunta el action del formulario al script o a la ruta que gestiona el POST.

¿Un 405 en las solicitudes HEAD afecta a Google?

No directamente, porque Googlebot pide las páginas con GET. Aun así importa: los monitores y comprobadores que usan HEAD pueden notificar la página como rota, y la especificación HTTP exige que los servidores admitan HEAD.