El campo de encabezado de solicitud Access-Control-Allow-Headers no está permitido por Access-Control-Allow-Headers

Resuelto user3194367 asked hace 10 años • 17 respuestas

Estoy intentando enviar archivos a mi servidor con una solicitud de publicación, pero cuando los envía, aparece el error:

El tipo de contenido del campo de encabezado de solicitud no está permitido por Access-Control-Allow-Headers.

Entonces busqué en Google el error y agregué los encabezados:

$http.post($rootScope.URL, {params: arguments}, {headers: {
    "Access-Control-Allow-Origin" : "*",
    "Access-Control-Allow-Methods" : "GET,POST,PUT,DELETE,OPTIONS",
    "Access-Control-Allow-Headers": "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
}

Entonces me sale el error:

El campo de encabezado de solicitud Access-Control-Allow-Origin no está permitido por Access-Control-Allow-Headers

Así que busqué eso en Google y la única pregunta similar que pude encontrar fue una respuesta a medias y luego la cerré como fuera de tema. ¿Qué encabezados se supone que debo agregar/eliminar?

user3194367 avatar Sep 08 '14 22:09 user3194367
Aceptado

Yo tuve el mismo problema. En la documentación de jQuery encontré:

Para solicitudes entre dominios, configurar el tipo de contenido en cualquier otro que no sea application/x-www-form-urlencoded, multipart/form-datao text/plainhará que el navegador envíe una solicitud de OPCIONES de verificación previa al servidor.

Entonces, aunque el servidor permite solicitudes de origen cruzado pero no lo permite Access-Control-Allow-Headers, arrojará errores. Por defecto, el tipo de contenido angular es application/json, que intenta enviar una solicitud de OPCIÓN. Intente sobrescribir el encabezado predeterminado angular o permitirlo Access-Control-Allow-Headersen el extremo del servidor. Aquí hay una muestra angular:

$http.post(url, data, {
    headers : {
        'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
    }
});
Fisherman avatar May 31 '2015 06:05 Fisherman

El servidor (al que se envía la solicitud POST) debe incluir el Access-Control-Allow-Headersencabezado (etc.) en su respuesta . Ponerlos en tu solicitud del cliente no tiene ningún efecto. Debe eliminar los encabezados 'Access-Control-Allow-...' de su solicitud POST.

Esto se debe a que depende del servidor especificar que acepta solicitudes de origen cruzado (y que permite el Content-Typeencabezado de la solicitud, etc.); el cliente no puede decidir por sí mismo si un servidor determinado debería permitir CORS.

El solicitante (navegador web) puede realizar una prueba de verificación previa de cuál es la política del mismo origen del servidor enviando una solicitud de 'OPCIONES' (es decir, no la solicitud 'POST' u 'GET' que desea). Si la respuesta a la solicitud 'OPCIONES' contiene encabezados 'Access-Control-Allow-...' que permiten los encabezados, el origen o los métodos que utiliza su solicitud, entonces el solicitante/navegador enviará su 'POST' o 'GET ' pedido.

(nota oscura :) Access-Control-Allow-... tiene el valor ' ' en lugar de enumerar el origen, los encabezados o los métodos específicos permitidos. Sin embargo, el antiguo cliente WebView de Android que estaba usando no respetaba el comodín '' y necesitaba los encabezados específicos enumerados en el encabezado Access-Control-Allow-Headers en la respuesta a la solicitud de OPCIONES.

Shai avatar Sep 08 '2014 15:09 Shai

Si eso ayuda a alguien (incluso si esto es un poco pobre, ya que solo debemos permitir esto para fines de desarrollo), aquí hay una solución Java, ya que encontré el mismo problema. [Editar] No utilice el comodín * ya que es una mala solución, utilícelo localhostsi realmente necesita que algo funcione localmente.

public class SimpleCORSFilter implements Filter {

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) res;
    response.setHeader("Access-Control-Allow-Origin", "my-authorized-proxy-or-domain");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
    chain.doFilter(req, res);
}

public void init(FilterConfig filterConfig) {}

public void destroy() {}

}
lekant avatar Nov 25 '2015 03:11 lekant

Puedes activar el encabezado adecuado en PHP con esto:

header('Access-Control-Allow-Origin: *');
header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, X-Requested-With");
Vinod Dhakad avatar Jul 12 '2018 14:07 Vinod Dhakad

El servidor (al que se envía la solicitud POST) debe incluir el encabezado Content-Type en su respuesta.

Aquí hay una lista de encabezados típicos para incluir, incluido un encabezado personalizado "X_ACCESS_TOKEN":

"X-ACCESS_TOKEN", "Access-Control-Allow-Origin", "Authorization", "Origin", "x-requested-with", "Content-Type", "Content-Range", "Content-Disposition", "Content-Description"

Eso es lo que el encargado del servidor http necesita configurar para el servidor web al que envía sus solicitudes.

También es posible que desee pedirle a su servidor que exponga el encabezado "Longitud del contenido".

Reconocerá esto como una solicitud de intercambio de recursos entre orígenes (CORS) y debería comprender las implicaciones de realizar esas configuraciones de servidor.

Para más detalles ver:

  • http://www.w3.org/TR/cors/
  • http://enable-cors.org/
l3x avatar Feb 23 '2015 15:02 l3x