Campo intestazione richiesta Access-Control-Allow-Headers non è consentito da Access-Control-Allow-Headers


224

Sto cercando di inviare file al mio server con una richiesta di post, ma quando lo invia provoca l'errore:

Il campo di intestazione della richiesta Content-Type non è consentito da Access-Control-Allow-Headers.

Quindi ho cercato su Google l'errore e ho aggiunto le intestazioni:

$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"
}

Quindi ottengo l'errore:

Campo di intestazione richiesta Access-Control-Allow-Origin non è consentito da Access-Control-Allow-Headers

Quindi ho cercato su Google e l'unica domanda simile che ho potuto trovare è stata fornita una mezza risposta poi chiusa come fuori tema. Quali intestazioni dovrei aggiungere / rimuovere?


Queste intestazioni vengono inviate dal server al browser in modo che il browser possa decidere se JS può analizzare la risposta. Aggiungerli alla richiesta non ha valore.
Pellyadolfo,

Risposte:


189

Il server (a cui viene inviata la richiesta POST) deve includere l' Access-Control-Allow-Headersintestazione (ecc.) Nella sua risposta . Inserirli nella richiesta del cliente non ha alcun effetto.

Questo perché spetta al server specificare che accetta le richieste di origine incrociata (e che consente l' Content-Typeintestazione della richiesta e così via) - il client non può decidere da solo che un determinato server dovrebbe consentire CORS.


5
Come posso impostare le intestazioni nel backend?
user3194367

11
@ user3194367: dipende dal back-end.
Felix Kling,

15
Immagino che dovrò parlare con il mio ragazzo del server.
user3194367

2
response.addHeader ("Access-Control-Allow-Headers", "yourKey");
Mayuresh,

2
@Mayuresh yourKey is what? Content-Type?
zhuguowei,

240

Ho avuto lo stesso problema. Nella documentazione di jQuery ho trovato:

Per richieste tra domini, l'impostazione del tipo di contenuto a qualcosa di diverso application/x-www-form-urlencoded, multipart/form-datao text/plainattiverà il browser per inviare un OPZIONI verifica preliminare richiesta al server.

Pertanto, sebbene il server consenta la richiesta di origine incrociata ma non lo consente Access-Control-Allow-Headers, genererà errori. Per impostazione predefinita, il tipo di contenuto angolare è application/json, che sta tentando di inviare una richiesta OPTION. Prova a sovrascrivere l'intestazione predefinita angolare o consentire Access-Control-Allow-Headersalla fine del server. Ecco un campione angolare:

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

28
Questa dovrebbe essere una risposta accettata, molto più istruttiva dell'altra!
Mike Szyndel,

1
Vorrei multipart / form-data perché desidero eseguire il backup di qualcosa
Vlado Pandžić,

3
or allow Access-Control-Allow-Headers in server endCome?
Omar,

1
@omar dipende dalla piattaforma server che stai utilizzando. se java c'è esempio su altre risposte se php c'è un nome di funzione headerper impostare l'intestazione della risposta
Fisherman

1
Finalmente, dopo due giorni di ricerche. Non ho parole per ringraziarti!
Mekey Salaria,

51

Se questo aiuta qualcuno, (anche se questo è un po 'scarso perché dobbiamo permetterlo solo a scopo di sviluppo) ecco una soluzione Java poiché ho riscontrato lo stesso problema. [Modifica] Non utilizzare il carattere jolly * in quanto è una cattiva soluzione, utilizzare localhostse è davvero necessario che qualcosa funzioni 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() {}

}

Come testimoniano le risposte multiple per le intestazioni di richiesta controllo accessi, ci sono chiaramente differenze dovute a diversi ambienti. Ciò che ha funzionato per me è stato ottenere l'accesso all'oggetto richiesta e scaricare i valori per le intestazioni, ma in particolare il valore dell'intestazione per "Access-Control-Request-Headers". Quindi, copia / incolla questo nel tuo response.setHeader ("Access-Control-Allow-Headers", "{incolla qui}"); Sto anche usando Java, ma ho richiesto valori aggiuntivi e alcuni citati in questa risposta non mi servivano.
Software Prophets,

Questa era una soluzione parziale (e, come detto, scarsa) per aiutare le persone e condividere indizi un anno fa. Non vedo il punto del voto negativo, ma questa è la tua libertà. L'idea è di consentire le intestazioni sul lato server in modo che quando viene inviata una richiesta OPTION, il client / browser sappia quali intestazioni sono consentite. Riconosco che c'è un po 'di confusione, il mio filtro CORS è cambiato molto da allora. Come pratica migliore, Access-Control-Allow-Origin non dovrebbe mai essere *; nella mia implementazione, è impostato da una proprietà.
lekant,

La soluzione è stata modificata per includere le migliori pratiche
lekant

16

Il server (a cui viene inviata la richiesta POST) deve includere l' intestazione Content-Type nella sua risposta.

Ecco un elenco di intestazioni tipiche da includere, inclusa un'intestazione "X_ACCESS_TOKEN" personalizzata:

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

Questo è ciò che il tuo ragazzo del server http deve configurare per il server web a cui stai inviando le tue richieste.

Puoi anche chiedere al tuo server di esporre l'intestazione "Content-Length".

Riconoscerà questo come una richiesta di condivisione delle risorse tra le origini (CORS) e dovrebbe comprendere le implicazioni della configurazione di tali server.

Per i dettagli vedere:


13

Puoi attivare l'intestazione corretta in PHP con questo:

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");

4
Descrivi in ​​che modo la tua risposta è diversa dalle altre risposte. Solo pubblicare un po 'di codice non è molto utile.
oscfri,

1
Sei una rockstar, il resto delle risposte approfondisce il lato tecnico. Il tuo risolve il mio problema, specificando anche i metodi che dovrebbero essere ammessi!
Daniel ZA,

1
@DanielZA anche se capisco cosa intendi con "le altre risposte approfondiscono il lato tecnico" quando vuoi solo far funzionare il tuo codice, SO è pensato per approfondire il lato tecnico delle cose come dovresti sapere perché le cose funzionano non solo come far funzionare quindi. Non incoraggiare questo comportamento quando si commentano soluzioni ...
nicolasassi

8

Quanto segue funziona per me 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();
});

è importante l'ordine dei metodi di controllo degli accessi?
vini

@vini, penso che non abbia importanza.
Ninja Coding,

4

Le intestazioni che stai cercando di impostare sono intestazioni di risposta . Devono essere forniti, nella risposta, dal server al quale stai effettuando la richiesta.

Non hanno posto sul client. Sarebbe inutile avere un mezzo per concedere le autorizzazioni se potessero essere concesse dal sito che voleva l' autorizzazione invece del sito che possedeva i dati.


Come posso impostare le intestazioni nel backend?
user3194367

@ user3194367 - Dipende dal tuo backend. Non so a quale server HTTP o linguaggio di programmazione stai facendo la richiesta.
Quentin,

Immagino che dovrò parlare con il mio ragazzo del server.
user3194367

3

Se qualcuno riscontra questo problema con un server express, aggiungi il seguente middleware

app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

3

se stai testando alcune richieste javascript per ionic2 o angularjs 2, in Chrome su PC o Mac, assicurati di installare il plug-in CORS per il browser Chrome per consentire il cross-source.

mayba ottenere richieste funzionerà senza che ciò sia necessario, ma pubblicare e inserire ed eliminare richiederà l'installazione del plug-in cors per l'esecuzione senza problemi di test, che sicuramente non è interessante, ma non so come la gente lo faccia senza plug-in CORS.

e assicurati anche che la risposta JSON non stia restituendo 400 con un certo stato JSON


3

questo è un problema di backend. se usi le vele API sul backend cambia cors.js e aggiungi il tuo archivio qui

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

In Asp Net Core , per farlo rapidamente funzionare per lo sviluppo; in Startup.cs, Configure methodaggiungi

app.UseCors(options => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());

2

Nel mio caso, sto ricevendo diversi parametri come @HeaderParam in un metodo di servizio web.

Questi parametri DEVONO essere dichiarati nel tuo filtro CORS in questo modo:

@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

Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-Headerserrore significa che il Access-Control-Allow-Origincampo dell'intestazione HTTP non è gestito o consentito dalla risposta. Rimuovi Access-Control-Allow-Origincampo dall'intestazione della richiesta.


2

Se stai usando localhoste PHP impostato su questo per risolvere il problema:

header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Headers: Content-Type'); 

Dal tuo utilizzo front-end:

{headers: {"Content-Type": "application/json"}}

e boom non più problemi da localhost!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.