HTTPQUERY
Español

Access-Control-Allow-Methods

Uso

Antes de enviar una solicitud de origen cruzado con un método que no sea simple, el navegador emite una solicitud de preflight OPTIONS. La cabecera Access-Control-Request-Method del preflight indica qué método pretende usar el cliente. El servidor responde con Access-Control-Allow-Methods para confirmar qué métodos se aceptan para el recurso de destino.

Los métodos simples (GET, HEAD y POST) están siempre permitidos por el protocolo CORS y, en sentido estricto, no es necesario enumerarlos aquí. Indicarlos de forma explícita es una práctica habitual y hace que la política del servidor se vea de un vistazo.

Varios métodos se expresan como una lista separada por comas.

Lista de nombres de método

Un conjunto de nombres de métodos HTTP separados por comas que el servidor acepta para el acceso de origen cruzado.

Access-Control-Allow-Methods: GET, POST, PUT, DELETE

* (comodín)

El asterisco actúa como comodín en las solicitudes sin credenciales y permite cualquier método.

Access-Control-Allow-Methods: *

Nota

En las solicitudes con credenciales, el comodín * se trata como una cadena literal, no como un comodín. Cuando hay credenciales, cada método permitido debe enumerarse de forma explícita.

Ejemplo

Una solicitud de preflight pregunta si se permite el método PUT. El servidor confirma varios métodos.

Solicitud

OPTIONS /api/resource/42 HTTP/1.1
Origin: https://example.com
Access-Control-Request-Method: PUT

Respuesta

HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Max-Age: 7200

Un servidor más restrictivo solo permite GET y POST.

Access-Control-Allow-Methods: GET, POST

Diagnóstico

Los fallos de preflight relacionados con los métodos HTTP bloquean la solicitud de origen cruzado real antes de que el servidor procese la operación prevista.

La consola muestra “Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.”. El servidor no incluyó el método solicitado en el valor de Access-Control-Allow-Methods. Añada el método que falta a la respuesta de preflight. En nginx: add_header Access-Control-Allow-Methods “GET, POST, PUT, DELETE, PATCH”; En Apache: Header set Access-Control-Allow-Methods “GET, POST, PUT, DELETE, PATCH”

La respuesta de preflight carece por completo de la cabecera. El manejador de OPTIONS existe, pero no devuelve Access-Control-Allow-Methods. Confirme que la ruta de preflight establece esta cabecera junto con Access-Control-Allow-Origin y Access-Control-Allow-Headers. La ausencia de la cabecera de métodos hace que el navegador rechace cualquier método que no sea simple.

El comodín * no funciona con solicitudes que llevan credenciales. Cuando Access-Control-Allow-Credentials vale true, el comodín se trata como la cadena literal * y no coincide con ningún método. Enumere de forma explícita cada método permitido en las configuraciones con credenciales.

El servidor devuelve 405 Method Not Allowed durante el preflight. El servidor no tiene ninguna ruta que gestione OPTIONS para la URL de destino, por lo que la solicitud llega a un manejador genérico que rechaza el método. Añada un manejador de OPTIONS a la ruta. En Express: app.options(‘/api/resource’, cors()). En Django, el middleware django-cors-headers gestiona OPTIONS automáticamente una vez instalado. En nginx, añada un bloque if ($request_method = OPTIONS) o use limit_except para permitir OPTIONS en esa location.

El framework gestiona OPTIONS automáticamente pero no incluye las cabeceras CORS. Algunos frameworks responden a OPTIONS con un 200 o un 204 y una cabecera Allow simple que enumera los métodos admitidos, pero sin adjuntar ninguna cabecera CORS. El navegador lo interpreta como un preflight fallido porque falta Access-Control-Allow-Methods. Configure el middleware de CORS para que intercepte las solicitudes OPTIONS antes del manejador integrado del framework. En Spring Boot, registre un bean CorsFilter. En ASP.NET, llame a services.AddCors() con la política correcta antes de app.UseRouting().