Das Anforderungsheaderfeld Access-Control-Allow-Headers ist von Access-Control-Allow-Headern nicht zulässig

224

Ich versuche, Dateien mit einer Post-Anfrage an meinen Server zu senden, aber wenn sie gesendet wird, verursacht sie den Fehler:

Anforderungsheaderfeld Inhaltstyp wird von Access-Control-Allow-Headern nicht zugelassen.

Also habe ich den Fehler gegoogelt und die Header hinzugefügt:

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

Dann bekomme ich den Fehler:

Anforderungsheaderfeld Access-Control-Allow-Origin ist von Access-Control-Allow-Headern nicht zulässig

Also habe ich das gegoogelt und die einzige ähnliche Frage, die ich finden konnte, war eine halbe Antwort, die dann als Off-Topic geschlossen wurde. Welche Header soll ich hinzufügen / entfernen?

user3194367
quelle
Diese Header werden vom Server an den Browser gesendet, damit der Browser entscheiden kann, ob der JS die Antwort analysieren darf. Das Hinzufügen zu der Anforderung hat keinen Wert.
Pellyadolfo

Antworten:

189

Der Server (an den die POST-Anforderung gesendet wird) muss den Access-Control-Allow-HeadersHeader (usw.) in seine Antwort aufnehmen . Das Einfügen in Ihre Anfrage vom Kunden hat keine Auswirkung.

Dies liegt daran, dass der Server festlegen muss, dass er Ursprungsübergreifende Anforderungen akzeptiert (und dass er den Content-TypeAnforderungsheader usw. zulässt ). Der Client kann nicht selbst entscheiden, ob ein bestimmter Server CORS zulassen soll.

Shai
quelle
5
Wie setze ich die Header im Backend?
user3194367
11
@ user3194367: Hängt von Ihrem Backend ab.
Felix Kling
14
Ich muss wohl mit meinem Server-Typ sprechen.
user3194367
2
response.addHeader ("Access-Control-Allow-Headers", "yourKey");
Mayuresh
2
@ Mayuresh yourKey ist was? Content-Type?
Zhuguowei
240

Ich hatte das gleiche Problem. In der jQuery-Dokumentation fand ich:

Für Cross-Domain - Anfragen, den Inhaltstyp auf etwas anderes als die Einstellung application/x-www-form-urlencoded, multipart/form-dataoder text/plainden Browser auslösen ein Preflight - OPTIONS - Anforderung an den Server zu senden.

Obwohl der Server eine Anforderung für unterschiedliche Herkunft zulässt Access-Control-Allow-Headers, diese jedoch nicht zulässt , werden Fehler ausgegeben. Standardmäßig lautet application/jsonder Winkelinhaltstyp, der versucht, eine OPTION-Anforderung zu senden. Versuchen Sie, den eckigen Standardheader zu überschreiben oder das Serverende zuzulassen Access-Control-Allow-Headers. Hier ist ein eckiges Beispiel:

$http.post(url, data, {
    headers : {
        'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8'
    }
});
Fischer
quelle
28
Dies sollte eine akzeptierte Antwort sein, viel informativer als die andere!
Mike Szyndel
1
Ich möchte mehrteilige / Formulardaten, weil ich etwas verbessern möchte
Vlado Pandžić
3
or allow Access-Control-Allow-Headers in server end Wie?
Omar
1
@omar hängt davon ab, welche Serverplattform Sie verwenden. Wenn Java gibt es ein Beispiel für andere Antworten, wenn PHP, dann gibt es einen Funktionsnamen header, um den Header der Antwort zu setzen
Fisherman
1
Endlich nach zwei Tagen Forschung. Ich habe keine Worte, um Ihnen zu danken!
Mekey Salaria
51

Wenn das irgendjemandem hilft (auch wenn dies etwas schlecht ist, da wir dies nur für Entwicklungszwecke zulassen müssen), ist hier eine Java-Lösung, da ich auf dasselbe Problem gestoßen bin. [Bearbeiten] Verwenden Sie nicht den Platzhalter *, da dies eine schlechte Lösung istlocalhost Sie ihn wenn wirklich etwas lokal funktionieren muss.

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
quelle
Wie aus mehreren Antworten für Access-Control-Request-Header hervorgeht, gibt es aufgrund unterschiedlicher Umgebungen deutliche Unterschiede. Was für mich funktioniert hat, war, Zugriff auf das Anforderungsobjekt zu erhalten und die Werte für die Header zu sichern, insbesondere aber den Headerwert für "Access-Control-Request-Headers". Kopieren Sie diese dann / fügen Sie sie in Ihren response.setHeader ein ("Access-Control-Allow-Headers", "{hier einfügen}"); Ich verwende auch Java, aber ich benötigte zusätzliche Werte und einige, die in dieser Antwort erwähnt wurden, brauchte ich nicht.
Software-Propheten
Dies war eine teilweise (und wie gesagt schlechte) Lösung, um Menschen zu helfen und Hinweise vor einem Jahr auszutauschen. Ich sehe keinen Grund für eine Abstimmung, aber das ist Ihre Freiheit. Die Idee ist, die Header auf der Serverseite zuzulassen, damit der Client / der Browser weiß, welche Header zulässig sind, wenn eine OPTION-Anforderung gesendet wird. Ich gebe zu, dass es ein bisschen Verwirrung gibt, mein CORS-Filter hat sich seitdem sehr verändert. Als bessere Vorgehensweise sollte Access-Control-Allow-Origin niemals * sein. In meiner Implementierung wird es durch eine Eigenschaft festgelegt.
Lekant
Die Lösung wurde bearbeitet, um Best Practices aufzunehmen
Lekant
16

Der Server (an den die POST-Anforderung gesendet wird) muss den Inhaltstyp enthalten Header in seine Antwort aufnehmen.

Hier ist eine Liste typischer Header, einschließlich eines benutzerdefinierten "X_ACCESS_TOKEN" -Headers:

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

Das muss Ihr http-Server-Typ für den Webserver konfigurieren, an den Sie Ihre Anforderungen senden.

Möglicherweise möchten Sie auch Ihren Server bitten, den Header "Content-Length" offenzulegen.

Er erkennt dies als CORS-Anforderung (Cross-Origin Resource Sharing) und sollte die Auswirkungen dieser Serverkonfigurationen verstehen.

Für Details siehe:

l3x
quelle
13

Sie können den richtigen Header in PHP damit aktivieren:

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
quelle
4
Bitte beschreiben Sie, wie sich Ihre Antwort von den anderen Antworten unterscheidet. Nur einen Code zu posten ist nicht sehr hilfreich.
Oscar
1
Sie sind ein Rockstar, der Rest der Antworten befasst sich mit der technischen Seite. Ihre behebt mein Problem, indem Sie die Methoden angeben, die ebenfalls zulässig sein sollen!
Daniel ZA
1
@DanielZA Obwohl ich verstehe, was Sie unter "Die anderen Antworten befassen sich mit der technischen Seite" verstehen, weil Sie nur Ihren Code ausführen möchten, soll SO sich mit der technischen Seite der Dinge befassen, da Sie wissen sollten, warum die Dinge nicht nur funktionieren wie man dann funktioniert. Verstehen Sie dieses Verhalten nicht, wenn Sie Lösungen kommentieren ...
nicolasassi
8

Folgendes funktioniert für mich mit 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();
});
Fernando Gabrieli
quelle
Ist die Reihenfolge der Zugriffssteuerungs-Zulassungsmethoden wichtig?
Vini
@vini, ich denke es spielt keine Rolle.
Ninja Coding
4

Die Header Sie Satz versuchen , sind Antwort - Header. Sie müssen in der Antwort von dem Server bereitgestellt werden, an den Sie die Anfrage stellen.

Sie haben keinen Platz auf dem Client festgelegt. Es wäre sinnlos, über ein Mittel zum Erteilen von Berechtigungen zu verfügen, wenn diese von der Site erteilt werden könnten, die die Berechtigung wünschte , anstelle der Site, der die Daten gehörten.

QUentin
quelle
Wie setze ich die Header im Backend?
user3194367
@ user3194367 - Das hängt von Ihrem Backend ab. Ich weiß nicht, an welchen HTTP-Server oder welche Programmiersprache Sie die Anfrage stellen.
Quentin
Ich muss wohl mit meinem Server-Typ sprechen.
user3194367
3

Wenn dieses Problem bei einem Express-Server auftritt, fügen Sie die folgende Middleware hinzu

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

Wenn Sie einige Javascript-Anforderungen für ionic2 oder anglejs 2 in Ihrem Chrome auf einem PC oder Mac testen, müssen Sie das CORS-Plugin für den Chrome-Browser installieren, um Cross-Origin zuzulassen.

mayba get Anfragen werden funktionieren, ohne dass dies erforderlich ist, aber beim Posten und Setzen und Löschen müssen Sie das cors-Plugin installieren, damit das Testen ohne Probleme funktioniert. Das ist definitiv nicht cool, aber ich weiß nicht, wie die Leute es ohne das CORS-Plugin machen.

und stellen Sie außerdem sicher, dass die JSON-Antwort nicht 400 von einem JSON-Status zurückgibt

Albaiti
quelle
3

Dies ist ein Backend-Problem. Wenn Sie die Segel-API im Backend verwenden, ändern Sie cors.js und fügen Sie Ihre Datei hier hinzu

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'
};
Sedat Y.
quelle
3

In Asp Net Core , damit es schnell für die Entwicklung funktioniert; in Startup.cs, Configure methodhinzufügen

app.UseCors(options => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
Gabriel P.
quelle
2

In meinem Fall erhalte ich mehrere Parameter als @HeaderParam in einer Webdienstmethode.

Diese Parameter MÜSSEN in Ihrem CORS-Filter folgendermaßen deklariert werden:

@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");   
    }
}
russellhoff
quelle
2

Request header field Access-Control-Allow-Origin is not allowed by Access-Control-Allow-HeadersFehler bedeutet, dass das Access-Control-Allow-OriginFeld des HTTP-Headers nicht als Antwort behandelt oder zugelassen wird. Entfernen Sie das Access-Control-Allow-OriginFeld aus dem Anforderungsheader.

Tony Stark
quelle
2

Wenn Sie localhostPHP verwenden und PHP einstellen, um das Problem zu lösen:

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

Von Ihrem Front-End-Einsatz:

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

und boom keine ausgaben mehr ab localhost!

jerryurenaa
quelle