El campo de encabezado de solicitud Access-Control-Allow-Headers no está permitido por Access-Control-Allow-Headers
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?
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-data
otext/plain
hará 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-Headers
en el extremo del servidor. Aquí hay una muestra angular:
$http.post(url, data, {
headers : {
'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
}
});
El servidor (al que se envía la solicitud POST) debe incluir el Access-Control-Allow-Headers
encabezado (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-Type
encabezado 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.
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 localhost
si 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() {}
}
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");
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/