Signatur
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
"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);
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);
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);
}
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);
});
// Wichtig · Fallstricke
- Veralteter Setter: Chromium (ab Version 115) lässt
document.domain-Zuweisungen standardmäßig ohne Wirkung. Nur mit dem HeaderOrigin-Agent-Cluster: ?0funktionieren 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
nullgesetzt. Deshalb müssen beide Seiten den Wert zuweisen, auch wenn eine davon schonexample.comist. - Das Setzen löst einen
SecurityErroraus, wenn der Wert ein Public Suffix oder keine übergeordnete Domain ist. Dasselbe gilt in Sandbox-iframes ohneallow-same-originund bei gesetzter Permissions-Policydocument-domain. - Die Lockerung betrifft nur den DOM-Zugriff. Sie gilt nicht für
fetch/XMLHttpRequest,localStorageoder Cookies. Für Anfragen ist CORS zuständig. - Zum reinen Auslesen sind
location.hostnamebzw.location.origindie klareren Alternativen.