Logo

CORS-Fehler bei Zugriff auf Dateien von anderen Servern

Info zu dieser Seite...

Kaffee-Spende

Kaffee-Spendenbild 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) 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.
Wichtig: Solche CORS-Fehler werden oft nur in der Browser-Konsole angezeigt und führen nicht unbedingt zu einer sichtbaren Fehlermeldung auf Ihrer Webseite. Wenn eine Ressource nicht geladen wird oder eine API-Anfrage fehlschlägt, ohne dass ein offensichtlicher Grund ersichtlich ist, prüfen Sie immer zuerst die Konsole auf CORS-bezogene Meldungen!

Warum tritt dieser Fehler auf? (Same-Origin Policy & CORS)

Preflight-Requests (OPTIONS-Anfragen)

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.

Wie kann man das Problem lösen? (Server-Konfiguration)

Die Lösung besteht fast immer darin, die Konfiguration Ihres Webservers anzupassen, damit dieser die notwendigen CORS-Header sendet.

1. Server-Einstellungen anpassen

Sie müssen Ihren Server so konfigurieren, dass er für die gewünschten Ressourcen die entsprechenden Header mitsendet.
Achtung: Das Sternchen (*) 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.

Beispiel für Apache (.htaccess)

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
  

    
Hinweis: Apache muss so konfiguriert sein, dass .htaccess-Dateien und mod_headers erlaubt sind.

Beispiel für Nginx

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)
}
    
Vergessen Sie nicht, Nginx nach Änderungen neu zu laden: sudo systemctl reload nginx.

Beispiel für Node.js (Express)

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

Beispiel für PHP (nativ, ohne Framework)

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!']);
?>
    
Stellen Sie sicher, dass diese header()-Aufrufe vor jeglicher HTML- oder Textausgabe (auch Leerzeichen) erfolgen.

2. Nur für bestimmte Ordner/Ressourcen freigeben

Wie in den Beispielen oben gezeigt, ist es empfehlenswert, CORS-Header nicht global für den gesamten Server zu setzen, sondern gezielt:

3. Nach der Änderung testen

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.

Debugging von CORS-Fehlern

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.

Die Entwicklertools Ihres Browsers sind Ihr bester Freund bei CORS-Problemen:
  1. Konsole (Console): Hier sehen Sie die genaue CORS-Fehlermeldung, die oft schon den entscheidenden Hinweis gibt (z.B. "Reason: CORS header 'Access-Control-Allow-Origin' missing").
  2. Netzwerk-Tab (Network):
    • Suchen Sie die fehlgeschlagene Anfrage in der Liste. Sie ist oft rot markiert.
    • Klicken Sie darauf und sehen Sie sich die "Headers" (Kopfzeilen) an.
      • Anfrage-Header (Request Headers): Prüfen Sie, ob ein Origin-Header gesendet wird. Dieser zeigt die Herkunft der Anfrage.
      • Antwort-Header (Response Headers): Hier müssen die 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.
      • Bei Preflight (OPTIONS) Anfragen: Diese müssen erfolgreich (Status 200 oder 204) sein und die korrekten Access-Control-Allow-Methods und Access-Control-Allow-Headers enthalten, damit die eigentliche Anfrage folgt. Eine fehlgeschlagene OPTIONS-Anfrage verhindert die Hauptanfrage.

Weitere wichtige Hinweise

Wichtige Sicherheitshinweise

Fazit

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!