← Zurück zum Glossar
webentwicklung

CORS

Cross-Origin Resource Sharing — Browser-Mechanismus, der kontrolliert, welche Domains API-Anfragen an einen Server stellen dürfen.

Aktualisiert: 23. Februar 2026

Was ist CORS?

CORS (Cross-Origin Resource Sharing) ist ein Browser-Sicherheitsmechanismus, der kontrolliert, welche Webseiten API-Anfragen an welche Server stellen dürfen. Ohne CORS würde die Same-Origin-Policy des Browsers jeden Cross-Origin-Request blockieren — also jeden Fetch- oder XHR-Aufruf, bei dem Protokoll, Domain oder Port von der aktuellen Seite abweichen. CORS ist das offizielle, server-gesteuerte Verfahren, diese Sperre selektiv aufzuheben.

Wichtig: CORS ist eine Browser-Sicherheit. Server-zu-Server-Kommunikation (z.B. PHP-seitige cURL-Aufrufe, WP-Cron, REST-API-Calls vom Backend) unterliegt CORS nicht. CORS greift ausschließlich, wenn JavaScript im Browser eine Anfrage an eine fremde Domain stellt.

Kurzprofil CORS

Kurzprofil

  • Typ: Browser-Sicherheitsmechanismus / HTTP-Header-Standard
  • Spezifikation: Fetch Standard (WHATWG) + W3C CORS
  • Eingeführt: 2009 (W3C Recommendation 2014)
  • Relevant für: Alle Browser-seitigen Cross-Origin-Requests (Fetch, XHR, AJAX)
  • Relevanz für WordPress/Web: Sehr hoch bei headless/decoupled WordPress

Wie funktioniert CORS?

Der Browser unterscheidet zwischen Simple Requests und Preflighted Requests:

Simple Requests (GET/POST mit bestimmten Content-Types) werden direkt gesendet. Der Browser prüft danach, ob der Access-Control-Allow-Origin-Header in der Antwort die anfragende Origin enthält. Fehlt der Header oder stimmt die Origin nicht überein, blockiert der Browser die Antwort — der Request wurde trotzdem ausgeführt.

Preflighted Requests (DELETE, PUT, PATCH, POST mit JSON-Body, Custom Headers) lösen vorab einen OPTIONS-Request aus:

// Preflight:
OPTIONS /wp-json/wp/v2/posts HTTP/1.1
Origin: https://frontend.example.com
Access-Control-Request-Method: POST
Access-Control-Request-Headers: Content-Type, X-WP-Nonce

// Server-Antwort:
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://frontend.example.com
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type, X-WP-Nonce
Access-Control-Max-Age: 3600

Nur wenn der Preflight erfolgreich ist, sendet der Browser den eigentlichen Request.

CORS in der Praxis

Für ein Headless-WordPress-Setup (Nuxt/Next.js Frontend, WordPress als Backend) müssen CORS-Header in WordPress konfiguriert werden:

// In functions.php oder einem Plugin:
add_action('init', function() {
    $allowed_origins = ['https://frontend.example.com', 'https://staging.example.com'];
    $origin = $_SERVER['HTTP_ORIGIN'] ?? '';

    if (in_array($origin, $allowed_origins)) {
        header("Access-Control-Allow-Origin: {$origin}");
        header('Access-Control-Allow-Credentials: true');
        header('Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE');
        header('Access-Control-Allow-Headers: Content-Type, X-WP-Nonce, Authorization');
    }

    if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
        status_header(204);
        exit();
    }
});

Access-Control-Allow-Origin: * ist verlockend einfach, aber problematisch: Mit Wildcard können keine Credentials (Cookies, Auth-Header) gesendet werden, und die Ressource ist für alle Domains zugänglich.

Auf einen Blick

Das Wichtigste

  • CORS ist Browser-seitig — Server-zu-Server-Calls sind nicht betroffen
  • Der Server steuert CORS über Response-Header (Access-Control-Allow-Origin etc.)
  • Preflight-Request (OPTIONS) bei non-simple Requests — der Server muss OPTIONS korrekt beantworten
  • Access-Control-Allow-Origin: * erlaubt keine Credentials
  • Headless WordPress braucht explizite CORS-Konfiguration für die REST API

Was passiert bei falsch konfiguriertem CORS?

CORS-Fehler sind einer der häufigsten Frustrationspunkte in der Frontend-Entwicklung. Der Browser loggt etwas wie: CORS policy: No 'Access-Control-Allow-Origin' header is present. Der Request wurde möglicherweise ausgeführt — aber die Antwort ist für JavaScript nicht zugänglich.

Ein typischer Fehler bei WordPress: Security-Plugins oder Webserver-Konfigurationen blockieren OPTIONS-Requests mit HTTP 403 — was Preflight-Requests zum Scheitern bringt und alle POST/PUT/DELETE-Calls aus dem Frontend unterbricht.

Häufige Fragen

Kann man CORS auf Server-Ebene (Nginx) statt in WordPress konfigurieren? Ja, und das ist oft besser: Nginx-Level CORS-Header greifen vor WordPress und müssen nicht durch Plugin-Code laufen. Nginx-Konfiguration ist konsistenter und performanter. Allerdings kennt Nginx nicht die WordPress-spezifischen Anforderungen (welche Custom Headers WordPress braucht).

Warum erscheint der CORS-Fehler nur im Browser, nicht in Postman? Weil CORS nur Browser-seitig erzwungen wird. Postman, cURL und Server-seitiger Code ignorieren Access-Control-Allow-Origin-Header vollständig — sie implementieren keine Same-Origin-Policy.

Was ist CORS mit Credentials? Mit Access-Control-Allow-Credentials: true können Cookies und Auth-Header cross-origin gesendet werden. Das erfordert: exakter Origin-Match statt Wildcard, credentials: 'include' im Fetch-Call, und explizite Whitelisting der Origin.

Verwandte Begriffe

COEP · CORP · HTTP · HTTPS · REST API

start call_