Unterstützen Sie mich mit einer Spende für diese Seite:
Du kannst die Seite teilen, bearbeiten und darauf aufbauen, solange du den Urheber angemessen nennst.
Diese Seite wurde am 30. März 2025 erstellt und ist lizenziert unter der
Creative Commons Attribution 4.0 International (CC BY 4.0)
Zuletzt bearbeitet am:
Wenn Sie mit einer externen Webanwendung oder Website auf Dateien (z.B. .json
, .xml
, Schriftarten) Ihres Servers zugreifen möchten, kann es zu folgender oder ähnlichen Fehlermeldungen in der Browser-Konsole kommen:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://beispiel.de/datei.json. (Reason: CORS header 'Access-Control-Allow-Origin' missing)
Access to fetch at 'https://beispiel.de/api/data' from origin 'https://fremde-app.de' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
http
, https
), den Hostnamen (z.B. meine-seite.de
) und den Port (z.B. 80
, 443
).
https://fremde-app.de
) auf eine Ressource Ihres Servers (z.B. https://beispiel.de/datei.json
) zuzugreifen, blockiert der Browser dies standardmäßig. Der Zugriff wird nur erlaubt, wenn Ihr Server die Anfrage mit spezifischen CORS-HTTP-Headern beantwortet, insbesondere dem Access-Control-Allow-Origin
-Header.
Für bestimmte Arten von Anfragen, die als "nicht einfach" (non-simple requests) gelten – z.B. solche mit anderen Methoden als GET
, HEAD
, POST
(mit bestimmten Content-Types) oder mit benutzerdefinierten Headern – sendet der Browser vor der eigentlichen Anfrage eine sogenannte Preflight-Anfrage mit der HTTP-Methode OPTIONS
an den Server.
OPTIONS
-Anfrage korrekt antworten und signalisieren, ob die eigentliche Anfrage erlaubt ist (z.B. durch Setzen von Access-Control-Allow-Origin
, Access-Control-Allow-Methods
, Access-Control-Allow-Headers
).PUT
oder POST
mit application/json
).Die Lösung besteht fast immer darin, die Konfiguration Ihres Webservers anzupassen, damit dieser die notwendigen CORS-Header sendet.
*
) bei Access-Control-Allow-Origin: *
erlaubt allen Domains den Zugriff. Dies kann ein Sicherheitsrisiko darstellen. Verwenden Sie es mit Bedacht, vorzugsweise nur für öffentliche, nicht-sensitive Daten. Für mehr Sicherheit sollten Sie gezielt die erlaubten Domains angeben, z.B. Access-Control-Allow-Origin: https://fremde-app.de
.
Platzieren Sie eine .htaccess
-Datei in dem Verzeichnis auf Ihrem Server, dessen Inhalte freigegeben werden sollen.
Global für alle Dateien im Ordner (und Unterordnern), in dem die .htaccess
liegt:
Header set Access-Control-Allow-Origin "*" # Optional: Erlaubte Methoden (wichtig für Preflight) # Header set Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, DELETE" # Optional: Erlaubte Header (wichtig für Preflight, wenn Client benutzerdefinierte Header sendet) # Header set Access-Control-Allow-Headers "Content-Type, Authorization"
Nur für bestimmte Dateitypen (z.B. .json
und .xml
) in einem Ordner (z.B. /public-data
):
Erstellen Sie dazu die Datei /public-data/.htaccess
mit folgendem Inhalt:
Header set Access-Control-Allow-Origin "https://fremde-app.de" # Wenn die fremde App von mehreren Domains zugreifen darf: # Header set Access-Control-Allow-Origin "https://app1.fremde.de" env= बुरीOrigin_app1 # Header set Access-Control-Allow-Origin "https://app2.fremde.de" env= बुरीOrigin_app2 # SetEnvIf Origin "^https://app1\.fremde\.de$" Origin_app1 # SetEnvIf Origin "^https://app2\.fremde\.de$" Origin_app2 # Wichtig für Preflight-Requests und wenn Cookies gesendet werden sollen Header set Access-Control-Allow-Credentials "true" Header set Access-Control-Allow-Methods "GET, OPTIONS" Header set Access-Control-Allow-Headers "Content-Type" # Erlaubt z.B. 'Content-Type' im Request
.htaccess
-Dateien und mod_headers
erlaubt sind.
Fügen Sie entsprechende add_header
-Direktiven in Ihrer Nginx-Serverkonfiguration (z.B. in einem server
- oder location
-Block) hinzu.
Für einen bestimmten Ordner (z.B. /public-api/data/
):
location /public-api/data/ { # Erlaube Zugriff von einer spezifischen Domain add_header 'Access-Control-Allow-Origin' 'https://fremde-app.de'; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range'; add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range'; # Welche Header der Client lesen darf # Behandlung von Preflight-Requests if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' 'https://fremde-app.de'; # Oder '*' wenn passend add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT, DELETE'; add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization, X-Requested-With'; add_header 'Access-Control-Max-Age' 1728000; # Wie lange das Ergebnis des Preflights gecacht werden darf (in Sekunden) add_header 'Content-Type' 'text/plain charset=UTF-8'; add_header 'Content-Length' 0; return 204; # No Content } # Normale Anfragen # ... Ihre normale Location-Konfiguration (z.B. try_files, root) }
sudo systemctl reload nginx
.
Verwenden Sie eine Middleware, um die Header zu setzen. Das Paket cors
ist hierfür sehr empfehlenswert.
Zuerst installieren: npm install cors
oder yarn add cors
.
Globale Freigabe für alle Routen (mit dem cors
-Paket):
const express = require('express'); const cors = require('cors'); // Importieren const app = express(); // Einfache Nutzung: Erlaubt alle Origins // app.use(cors()); // Konfigurierte Nutzung: Nur spezifische Origin erlauben const corsOptions = { origin: 'https://fremde-app.de', // Erlaubte Origin optionsSuccessStatus: 200 // Für ältere Browser (IE11, diverse SmartTVs) }; app.use(cors(corsOptions)); app.get('/api/data', (req, res) => { res.json({ message: 'Daten von meinem Server!' }); }); app.listen(3000, () => console.log('Server läuft auf Port 3000'));
Freigabe nur für bestimmte Routen (z.B. alles unter /public-data/
):
const express = require('express'); const cors = require('cors'); const app = express(); const publicDataCorsOptions = { origin: 'https://fremde-app.de', methods: ['GET', 'OPTIONS'] // Nur GET und OPTIONS für diesen Pfad erlauben }; // CORS nur für Routen unter /public-data/ anwenden app.use('/public-data', cors(publicDataCorsOptions)); app.get('/public-data/info.json', (req, res) => { res.json({ info: "Dies sind öffentliche Daten" }); }); app.get('/private-data/secret.json', (req, res) => { // Für diese Route greift die obige CORS-Konfiguration nicht res.json({ secret: "Dies sind private Daten" }); }); app.listen(3000, () => console.log('Server läuft auf Port 3000'));
Sie können die Header direkt am Anfang Ihres PHP-Skripts setzen, bevor irgendeine Ausgabe erfolgt.
Beispiel für eine Datei public-data/get-data.php
:
'Daten von meinem PHP-Skript!']); ?>
header()
-Aufrufe vor jeglicher HTML- oder Textausgabe (auch Leerzeichen) erfolgen.
Wie in den Beispielen oben gezeigt, ist es empfehlenswert, CORS-Header nicht global für den gesamten Server zu setzen, sondern gezielt:
.htaccess
nur in dem Ordner, dessen Dateien von außen erreichbar sein sollen, oder verwenden Sie
, um es auf bestimmte Dateitypen einzuschränken.location
-Blöcke.
Rufen Sie die Datei oder den API-Endpunkt erneut von der externen Anwendung auf. Überprüfen Sie die Browser-Konsole (meist F12-Taste) auf Fehler. Im "Netzwerk" oder "Network"-Tab der Entwicklertools können Sie die HTTP-Header der Serverantwort inspizieren und sicherstellen, dass die Access-Control-Allow-Origin
und andere CORS-Header korrekt gesetzt sind.
Der erste Schritt: Browser-Konsole prüfen!
CORS-Fehler sind oft "versteckt" und werden nur in der Konsole der Entwicklertools Ihres Browsers angezeigt, nicht direkt auf der Webseite. Wenn eine Cross-Origin-Anfrage (z.B. ein fetch
zu einer anderen Domain) fehlschlägt oder Daten nicht wie erwartet geladen werden, prüfen Sie immer zuerst die Browser-Konsole (oft mit F12 aufrufbar) auf Fehlermeldungen.
Origin
-Header gesendet wird. Dieser zeigt die Herkunft der Anfrage.Access-Control-Allow-Origin
und ggf. weitere CORS-Header vom Server vorhanden sein. Wenn sie fehlen oder falsch sind (z.B. falsche Domain bei spezifischer Freigabe), ist das die Ursache.Access-Control-Allow-Methods
und Access-Control-Allow-Headers
enthalten, damit die eigentliche Anfrage folgt. Eine fehlgeschlagene OPTIONS-Anfrage verhindert die Hauptanfrage.fetch(url, {credentials: 'include'})
),
darf der Server nicht Access-Control-Allow-Origin: *
senden.
Stattdessen muss er die exakte Origin der anfragenden Seite zurückgeben (z.B. Access-Control-Allow-Origin: https://fremde-app.de
)
und zusätzlich den Header Access-Control-Allow-Credentials: true
setzen.
Access-Control-Allow-Origin
kann immer nur eine einzige Domain oder *
enthalten. Wenn Sie mehrere spezifische Domains erlauben möchten, muss Ihre Serverlogik den Origin
-Header der Anfrage prüfen und, falls dieser zu den erlaubten Domains gehört, ihn dynamisch in der Access-Control-Allow-Origin
-Antwort widerspiegeln. Das cors
-Paket für Node.js kann dies z.B. über eine Array-Konfiguration für origin
handhaben.
https://cors-anywhere.herokuapp.com/
(oft überlastet), oder selbst einen aufsetzen.
Access-Control-Allow-Origin: *
ist oft zu freizügig. Geben Sie wenn möglich immer spezifische Domains an, denen Sie vertrauen.Access-Control-Allow-Credentials: true
gesetzt ist, muss Access-Control-Allow-Origin
eine spezifische Domain sein, nicht *
.Access-Control-Allow-Methods
) und Headern (Access-Control-Allow-Headers
), die Sie erlauben. Erlauben Sie nur, was wirklich benötigt wird.CORS-Fehler entstehen durch die Same-Origin Policy, eine wichtige Sicherheitsfunktion von Browsern. Die Lösung liegt in der korrekten Konfiguration des Servers, der die angefragten Ressourcen bereitstellt. Durch das Setzen der richtigen HTTP-CORS-Header kann der Server dem Browser signalisieren, dass Zugriffe von bestimmten anderen Origins erlaubt sind. Eine sorgfältige Konfiguration ist dabei sowohl für die Funktionalität als auch für die Sicherheit entscheidend. Und denken Sie daran: Der erste Blick bei Problemen gehört immer in die Browser-Konsole!