CORS erklärt: Preflight, Header und CORS-Fehler beheben

CORS erklärt

CORS erklärt: Preflight, Header, Fehler und Lösungen | We.Inc

So funktioniert CORS: einfache Requests vs. Preflight, alle Access-Control-Header, Regeln für Credentials, die häufigsten Konsolenfehler und ein Server-Fix für Express, Next.js und nginx.

CORS (Cross-Origin Resource Sharing) ist der Weg, über den ein Server dem Browser mitteilt, dass JavaScript von einem anderen Origin seine Antworten lesen darf. Der Server antwortet mit Access-Control-Allow-Origin und verwandten Headern. Requests mit anderen Methoden, eigenen Headern oder JSON-Bodys senden zuerst einen OPTIONS-Preflight. Die Lösung gehört immer auf den Server, den du aufrufst, niemals in die Seite.

Die CORS-Response-Header auf einen Blick

Ein CORS-Fehler sieht aus, als wäre dein Code kaputt, dabei hat der Request den Server meist ganz normal erreicht. Der Browser hat sich lediglich geweigert, die Antwort an dein Skript zu übergeben. Mit dem Simulator unten beschreibst du einen Request und eine Server-Konfiguration und siehst dann, ob ein Preflight ausgelöst wird, ob der Browser die Antwort durchlässt und welche Konsolenmeldung du erhalten würdest.

Häufige Fragen

Warum funktioniert es mit Postman oder curl, aber nicht im Browser?

CORS wird nur von Browsern durchgesetzt, damit die Skripte einer Website nicht mit deinen Cookies die Daten einer anderen Website lesen können. Tools wie curl führen keinen fremden Seitencode aus und ignorieren CORS deshalb. Die Server-Antwort war identisch, nur der Browser hat entschieden, sie zurückzuhalten.

Was löst einen Preflight-Request aus?

Jede Methode außer GET, HEAD oder POST, jeder Header außerhalb der wenigen freigegebenen (Accept, Accept-Language, Content-Language, Content-Type, Range) oder ein anderer Content-Type als Formular-Encoding, multipart oder text/plain. Das Senden von application/json ist der häufigste Auslöser.

Kann ich CORS im Frontend beheben?

Nein. Access-Control-Header in deinem Request zu setzen bewirkt nichts, und mode: no-cors liefert dir eine undurchsichtige Antwort, die dein Skript nicht lesen kann. Entweder fügt die API die Header hinzu, oder dein eigener Server holt die Daten ab und reicht sie weiter.

Kann ich Access-Control-Allow-Origin: * mit Cookies verwenden?

Nein. Wenn ein Request Credentials mitsendet, lehnt der Browser einen Wildcard-Origin ab und verlangt den exakten Origin plus Access-Control-Allow-Credentials: true. Dasselbe gilt für Wildcards in den Listen für Methoden, Header und Expose-Header.

Warum kann mein Skript einen eigenen Response-Header nicht lesen?

Cross-Origin-Skripte sehen standardmäßig nur eine kurze Liste sicherer Response-Header. Trage alle anderen in Access-Control-Expose-Headers ein, zum Beispiel X-Request-Id, dann werden sie lesbar.

Same Origin, und warum der Browser das Lesen blockiert

Einfache Requests und Preflights

Den Konsolenfehler lesen

Häufige CORS-Fehler und wie du sie behebst

Der Wortlaut der Meldungen unterscheidet sich je nach Browser. Das hier sind die Gründe, wie Firefox sie auf MDN benennt; Chrome sagt dasselbe in längeren Sätzen.

CORS-Gründe in der Konsole und die Lösung auf dem Server

Server-Snippets

Express: Allowlist mit Credentials

Gibt den Origin nur zurück, wenn er auf der Liste steht, beantwortet Preflights mit 204 und fügt Vary hinzu, damit Caches die Origins auseinanderhalten.

Next.js-Route-Handler

Ein öffentlicher Endpunkt ohne Cookies kann die Wildcard verwenden. Exportiere OPTIONS, damit der Preflight eine eigene Antwort bekommt.

nginx vor einer API

Das Flag always behält den Header auch bei Fehlerantworten bei, sodass ein 500 seinen echten Status zeigt statt eines CORS-Fehlers.

Die Browserseite: Cookies Cross-Origin senden

credentials: "include" ist das, was auf dem Server die strengeren Regeln für Credentials aktiviert.

CORS-Request-Simulator

Beschreibe einen Request und die CORS-Header des Servers, um zu sehen, ob ein Preflight gesendet wird und ob der Browser dein Skript die Antwort lesen lässt.

Der Request

Die Antwort des Servers

Origin der Seite

Origin der API

Methode

Content-Type

Kein Body

Zusätzlicher Request-Header (leer für keinen)

Cookies senden (credentials: include)

Access-Control-Allow-Origin

Access-Control-Allow-Methods

Access-Control-Allow-Headers

Access-Control-Allow-Credentials: true

Ergebnis

Same Origin: CORS greift nicht, die Antwort ist lesbar.

Kein Preflight: Das ist ein einfacher Request.

Preflight nötig: Der Browser sendet zuerst OPTIONS.

Grund: Die Methode ist nicht GET, HEAD oder POST.

Grund: Der Header {v} ist nicht freigegeben.

Grund: Content-Type {v} gehört nicht zu den drei einfachen Typen.

Erlaubt: Dein Skript kann die Antwort lesen.

Blockiert. Grund in der Konsole:

Header, die der Server senden sollte

Kostenlos starten · Keine Kreditkarte nötig

Verwandt: Ratgeber

Produkt

Für wen

Funktionen

Ressourcen

Unternehmen

Sitemap