Start · Sprachen · JavaScript · Referenz · Document.domain

Document.domain

Eigenschaft

Liest den Domain-Teil des Ursprungs (Origin) des aktuellen Dokuments oder setzt ihn (veraltet), um die Same-Origin-Policy zu lockern.

seit JavaScript Baseline: alle Browser (Setter veraltet, in Chromi deprecated seit ja Kategorie: webapi

Signatur

Document.domain

Beschreibung

Die Eigenschaft document.domain gibt den Host-Teil des Ursprungs des aktuellen Dokuments zurück, also zum Beispiel "shop.example.com" für https://shop.example.com:8443/warenkorb. Protokoll und Port gehören nicht dazu. Beim Lesen ist die Eigenschaft unkritisch und liefert im Wesentlichen denselben Wert wie location.hostname.

Früher setzte man die Eigenschaft vor allem, um die Same-Origin-Policy zwischen Subdomains zu lockern. Setzen zwei Dokumente wie a.example.com und b.example.com beide document.domain = "example.com", dürfen sie gegenseitig auf ihr DOM zugreifen, etwa über iframe.contentWindow.document. Erlaubt sind dabei nur der aktuelle Host oder eine übergeordnete Domain, die keine öffentliche Endung (Public Suffix wie com oder co.uk) ist.

Der Setter gilt heute als veraltet. Er schwächt die Sicherheitsgrenzen, und Browser schränken ihn zunehmend ein: Chromium ignoriert ihn standardmäßig, sobald die Seite origin-bezogene Agent-Cluster nutzt. Für neue Anwendungen solltest du stattdessen window.postMessage(), BroadcastChannel oder CORS verwenden.

Parameter

Name Typ Default Beschreibung
$value string Nur beim (veralteten) Setzen: der neue Domain-Wert. Er muss der aktuelle Host oder eine übergeordnete Domain davon sein, die kein Public Suffix ist. Andernfalls wird eine SecurityError-DOMException ausgelöst.

Rückgabewert

Typ
string
Beschreibung
Der Domain-Teil (Host ohne Port) des Dokument-Ursprungs, z. B. "www.example.com". Bei opaken Ursprüngen (etwa data:-URLs oder Sandbox-iframes) ist das eine leere Zeichenkette.

Beispiele

Aktuelle Domain auslesen

// Auf https://shop.example.com:8443/warenkorb
console.log(document.domain);
console.log(location.hostname);
console.log(location.origin);
shop.example.com shop.example.com https://shop.example.com:8443

Umgebung anhand der Domain erkennen

const istLokal = ['localhost', '127.0.0.1'].includes(document.domain);
const apiBasis = istLokal
  ? 'http://localhost:3000/api'
  : `https://api.${document.domain.replace(/^www\./, '')}`;
console.log(apiBasis);
https://api.example.com (auf www.example.com)

Veraltet: Domain lockern mit Fehlerbehandlung

// Auf a.example.com – NICHT für neuen Code empfohlen
try {
  document.domain = 'example.com';
  console.log('Domain gesetzt:', document.domain);
} catch (err) {
  // z. B. SecurityError bei 'com' oder fremder Domain
  console.error(err.name, err.message);
}
Domain gesetzt: example.com

Moderne Alternative: postMessage zwischen Subdomains

// Elternseite auf https://a.example.com
const frame = document.querySelector('#widget');
frame.addEventListener('load', () => {
  frame.contentWindow.postMessage({ typ: 'hallo' }, 'https://b.example.com');
});

window.addEventListener('message', (event) => {
  if (event.origin !== 'https://b.example.com') return; // Herkunft prüfen!
  console.log('Antwort:', event.data);
});
Antwort: { typ: 'ok' }

// Wichtig · Fallstricke

  • Veralteter Setter: Chromium (ab Version 115) lässt document.domain-Zuweisungen standardmäßig ohne Wirkung. Nur mit dem Header Origin-Agent-Cluster: ?0 funktionieren sie noch. Auch Firefox und Safari planen eine Einschränkung. Verlass dich nicht darauf.
  • Sicherheit: Mit dem Setzen öffnest du dein DOM für jede Subdomain, die dasselbe tut. Eine kompromittierte oder nutzergesteuerte Subdomain (z. B. user123.example.com) kann dann per XSS auf deine Seite zugreifen.
  • Durch das Setzen wird intern der Port auf null gesetzt. Deshalb müssen beide Seiten den Wert zuweisen, auch wenn eine davon schon example.com ist.
  • Das Setzen löst einen SecurityError aus, wenn der Wert ein Public Suffix oder keine übergeordnete Domain ist. Dasselbe gilt in Sandbox-iframes ohne allow-same-origin und bei gesetzter Permissions-Policy document-domain.
  • Die Lockerung betrifft nur den DOM-Zugriff. Sie gilt nicht für fetch/XMLHttpRequest, localStorage oder Cookies. Für Anfragen ist CORS zuständig.
  • Zum reinen Auslesen sind location.hostname bzw. location.origin die klareren Alternativen.