Access-Control-Allow-Headers no está permitido por Access-Control-Allow-Headers


Estoy tratando de enviar archivos a mi servidor con una solicitud post, pero cuando se envía causa el error:

Request header field Content-Type is not allowed by Access-Control-Allow-Headers.

Así que 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 obtengo el error:

Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headers

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

Author: Emile Bergeron, 2014-09-08

12 answers

El servidor (al que se envía la solicitud POST) necesita incluir el encabezado Access-Control-Allow-Headers (etc) en su respuesta. Ponerlos en su solicitud del cliente no tiene efecto.

Esto se debe a que depende del servidor especificar que acepta solicitudes de origen cruzado (y que permite el encabezado de solicitud Content-Type, y así sucesivamente)-el cliente no puede decidir por sí mismo que un servidor dado debe permitir CORS.

 138
Author: Shai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-08 15:08:39

Yo tenía el mismo problema. En la documentación de jQuery encontré:

Para las solicitudes entre dominios, establecer el tipo de contenido a cualquier otra cosa que no sea application/x-www-form-urlencoded, multipart/form-data, o text/plain activará el navegador para enviar una solicitud de OPCIONES de comprobación previa al servidor.

Así que aunque el servidor permite la petición de origen cruzado pero no permite Access-Control-Allow-Headers, arrojará errores. Por defecto angular content type es application/json, que está tratando de enviar una solicitud de OPCIÓN. Intenta sobrescribir angular cabecera predeterminada o permitir 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'
    }
});
 176
Author: Fisherman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-12 11:02:25

Si eso ayuda a alguien, incluso este tipo de pobres, ya que solo debemos permitir esto para fines de desarrollo, aquí hay una solución Java, ya que me encontré con el mismo problema. [Editar] No use el comodín * ya que es una mala solución, use localhost si realmente necesita tener algo que 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() {}

}
 39
Author: lekant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-27 22:41:28

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

Aquí hay una lista de encabezados típicos para incluir, incluyendo 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 tu chico del servidor http necesita configurar para el servidor web al que estás enviando tus solicitudes.

También puede pedirle a su servidor que exponga el encabezado "Content-Length".

Reconocerá esto como un Origen Cruzado Compartir recursos (CORS) solicitar y debe entender las implicaciones de hacer esas configuraciones de servidor.

Para más detalles ver:

 13
Author: l3x,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-23 15:35:36

Lo siguiente funciona para mí con nodejs:

xServer.use(function(req, res, next) {
  res.setHeader("Access-Control-Allow-Origin", 'http://localhost:8080');
  res.setHeader('Access-Control-Allow-Methods', 'POST,GET,OPTIONS,PUT,DELETE');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Accept');

  next();
});
 6
Author: Fernando Gabrieli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-16 16:29:55

Los encabezados que está intentando establecer son los encabezados response. Tienen que ser proporcionados, en la respuesta, por el servidor al que está haciendo la solicitud.

No tienen lugar en el cliente. Sería inútil tener un medio para otorgar permisos si pudieran ser otorgados por el sitio que quería permiso en lugar del sitio que poseía los datos.

 4
Author: Quentin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-08 15:05:12

Si alguien experimenta este problema con un servidor express, agregue el siguiente middleware

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});
 3
Author: Abdel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-23 14:08:09

Este es un problema de backend. si usa la api de sails en el backend, cambie cors.js y añadir su archivado aquí

module.exports.cors = {
  allRoutes: true,
  origin: '*',
  credentials: true,
  methods: 'GET, POST, PUT, DELETE, OPTIONS, HEAD',
  headers: 'Origin, X-Requested-With, Content-Type, Accept, Engaged-Auth-Token'
};
 3
Author: Sedat Y,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-17 23:41:40

Si está probando algunas solicitudes de javascript para ionic2 o angularjs 2 , en su chrome en pc o mac , asegúrese de instalar el complemento CORS para el navegador chrome para permitir el origen cruzado .

Mayba obtener solicitudes funcionará sin necesidad de que , pero post y puts y eliminar tendrá que instalar cors plugin para las pruebas para ir sin problemas , que definitivamente no es genial , pero no sé cómo la gente lo hace sin CORS plugin .

Y también asegúrese de que la respuesta json no devolviendo 400 por algún estado json

 2
Author: albaiti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-08 13:17:56

En mi caso, estoy recibiendo varios parámetros como @HeaderParam en un método de servicio web.

Estos parámetros DEBEN ser declarados en su filtro CORS de esa manera:

@Provider
public class CORSFilter implements ContainerResponseFilter {

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) throws IOException {

        MultivaluedMap<String, Object> headers = responseContext.getHeaders();

        headers.add("Access-Control-Allow-Origin", "*");
        ...
        headers.add("Access-Control-Allow-Headers", 
        /*
         * name of the @HeaderParam("name") must be declared here (raw String):
         */
        "name", ...);
        headers.add("Access-Control-Allow-Credentials", "true");
        headers.add("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS, HEAD");   
    }
}
 2
Author: russellhoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-08 22:45:31

Puede activar el encabezado apropiado 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");
 2
Author: Vinod Dhakad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-22 22:53:53

Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headers error significa que el campo Access-Control-Allow-Origin del encabezado HTTP no es manejado o permitido por la respuesta. Elimine el campo Access-Control-Allow-Origin del encabezado de la solicitud.

 1
Author: Tony Stark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-12 19:44:11