Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten. Erfahre mehr über dieses Experiment.

View in English Always switch to English

CORS-Fehler

Cross-Origin Resource Sharing (CORS) ist ein Standard, der es einem Server erlaubt, die Same-Origin-Policy zu lockern. Dies wird verwendet, um einige Cross-Origin-Anfragen explizit zuzulassen, während andere abgelehnt werden. Wenn eine Website beispielsweise einen einbettbaren Dienst anbietet, kann es notwendig sein, bestimmte Einschränkungen zu lockern. Das Einrichten einer solchen CORS-Konfiguration ist nicht unbedingt einfach und kann einige Herausforderungen mit sich bringen. Auf diesen Seiten werden wir einige häufige CORS-Fehlermeldungen und deren Lösung betrachten.

Wenn die CORS-Konfiguration nicht korrekt eingerichtet ist, zeigt die Browserkonsole einen Fehler wie "Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at [some site]" an, der angibt, dass die Anfrage aufgrund einer Verletzung der CORS-Sicherheitsregeln blockiert wurde. Dies muss nicht unbedingt ein Einrichtungsfehler sein. Es ist möglich, dass die Anfrage tatsächlich von der Webanwendung des Benutzers und dem externen Dienstleister absichtlich nicht zugelassen wird. Wenn der Endpunkt jedoch zugänglich sein soll, ist eine Fehlerbehebung erforderlich, um erfolgreich zu sein.

Identifizieren eines CORS-Problems

Um das zugrunde liegende Problem mit der CORS-Konfiguration zu verstehen, müssen Sie herausfinden, welche Anfrage fehlerhaft ist und warum. Diese Schritte können Ihnen dabei helfen:

  1. Navigieren Sie zu der betreffenden Website oder Web-App und öffnen Sie die Developer Tools.
  2. Versuchen Sie nun, die fehlgeschlagene Transaktion zu reproduzieren und überprüfen Sie die Konsole, ob Sie eine CORS-Verletzungs-Fehlermeldung sehen. Es wird wahrscheinlich so aussehen:

Firefox-Konsole zeigt CORS-Fehler

Der Text der Fehlermeldung wird in etwa wie folgt aussehen:

Cross-Origin Request Blocked: The Same Origin Policy disallows
reading the remote resource at https://some-url-here. (Reason:
additional information here).

Hinweis: Aus Sicherheitsgründen sind Details darüber, was bei einer CORS-Anfrage schiefgelaufen ist, für JavaScript-Code nicht verfügbar. Der Code weiß nur, dass ein Fehler aufgetreten ist. Der einzige Weg, um herauszufinden, was genau schiefgelaufen ist, besteht darin, sich die Details in der Browserkonsole anzusehen.

Überlegungen auf der Client-Seite

Die meisten CORS-Fehler können nur auf dem Server behoben werden, da der Server steuert, ob Cross-Origin-Zugriff erlaubt ist. Es gibt jedoch einige Dinge, die Sie auf der Client-Seite tun können:

Vermeiden Sie das Auslösen eines Preflight-Checks

Browser senden eine Preflight-Anfrage, bevor die tatsächliche Anfrage ausgelöst wird, wenn bestimmte Bedingungen erfüllt sind (benutzerdefinierte Header, Methoden außer GET/HEAD/POST oder nicht einfache Content-Typen). Wenn der Server keine Preflight-Anfragen bearbeitet, können Sie Ihre Anfrage so umstrukturieren, dass sie als einfache Anfrage qualifiziert:

Einfache Anfragen umgehen den Preflight-Check vollständig, was eine Klasse von CORS-Fehlern im Zusammenhang mit der Preflight-Bearbeitung vermeidet.

Verwenden Sie den no-cors-Modus für undurchsichtige Antworten

Wenn Sie den Antwortinhalt oder die Header nicht lesen müssen - zum Beispiel beim Senden von Analytics-Beacons oder beim Laden von Ressourcen in einen Cache über einen Service Worker - können Sie den mode auf "no-cors" in einem fetch()-Aufruf setzen:

js
fetch("https://api.example.com/log", {
  method: "POST",
  mode: "no-cors",
  body: data,
});

Die Antwort wird undurchsichtig sein: Ihr Status ist 0, ihre Header sind leer und ihr Body ist für JavaScript nicht lesbar. Dies ist absichtlich so - no-cors deaktiviert die CORS-Prüfung, aber im Gegenzug verlieren Sie jeglichen Zugriff auf den Antwortinhalt.

Verwenden Sie einen Proxy-Server

Wenn Sie den entfernten Server nicht kontrollieren und dieser keine CORS-Header setzt, können Sie Anfragen über einen Server leiten, den Sie kontrollieren. Ihr Server ruft die Ressource in Ihrem Namen ab und gibt sie mit den entsprechenden CORS-Headern zurück. Dieser Ansatz erhöht die Latenz und führt zu einer Abhängigkeit von Ihrem Proxy, funktioniert aber, wenn andere Optionen nicht verfügbar sind.

CORS-Fehlermeldungen

Die Konsole von Firefox zeigt Nachrichten in ihrer Konsole an, wenn Anfragen aufgrund von CORS fehlschlagen. Ein Teil des Fehlertextes ist eine "Grund"-Nachricht, die zusätzlichen Einblick in das Problem gibt. Die Grundnachrichten sind unten aufgeführt; klicken Sie auf die Nachricht, um einen Artikel zu öffnen, der den Fehler genauer erklärt und mögliche Lösungen bietet.

Die meisten CORS-Fehler können nur auf dem Server behoben werden, da der Server steuert, ob Cross-Origin-Zugriff erlaubt ist. Es gibt jedoch einige Dinge, die Sie auf der Client-Seite tun können:

Vermeiden Sie das Auslösen eines Preflight-Checks

Browser senden eine Preflight-Anfrage, bevor die tatsächliche Anfrage ausgelöst wird, wenn bestimmte Bedingungen erfüllt sind (benutzerdefinierte Header, Methoden außer GET/HEAD/POST oder nicht einfache Content-Typen). Wenn der Server keine Preflight-Anfragen bearbeitet, können Sie Ihre Anfrage so umstrukturieren, dass sie als einfache Anfrage qualifiziert:

Einfache Anfragen umgehen den Preflight-Check vollständig, was eine Klasse von CORS-Fehlern im Zusammenhang mit der Preflight-Bearbeitung vermeidet.

Verwenden Sie den no-cors-Modus für undurchsichtige Antworten

Wenn Sie den Antwortinhalt oder die Header nicht lesen müssen — zum Beispiel beim Senden von Analytics-Beacons oder beim Laden von Ressourcen in einen Cache über einen Service Worker — können Sie den mode auf "no-cors" in einem fetch()-Aufruf setzen:

js
fetch("https://api.example.com/log", {
  method: "POST",
  mode: "no-cors",
  body: data,
});

Die Antwort wird undurchsichtig sein: Ihr Status ist 0, ihre Header sind leer und ihr Body ist für JavaScript nicht lesbar. Dies ist absichtlich so — no-cors deaktiviert die CORS-Prüfung, aber im Gegenzug verlieren Sie jeglichen Zugriff auf den Antwortinhalt.

Verwenden Sie einen Proxy-Server

Wenn Sie den entfernten Server nicht kontrollieren und dieser keine CORS-Header setzt, können Sie Anfragen über einen Server leiten, den Sie kontrollieren. Ihr Server ruft die Ressource in Ihrem Namen ab und gibt sie mit den entsprechenden CORS-Headern zurück. Dieser Ansatz erhöht die Latenz und führt zu einer Abhängigkeit von Ihrem Proxy, funktioniert aber, wenn andere Optionen nicht verfügbar sind.

Siehe auch