Signatur
Beschreibung
Die Eigenschaft responseURL eines XMLHttpRequest-Objekts enthält die URL, von der die Antwort tatsächlich stammt. Folgt der Browser serverseitigen Weiterleitungen (HTTP 301, 302, 303, 307, 308), steht hier die URL nach der letzten Weiterleitung und nicht die ursprünglich an open() übergebene Adresse.
Die URL wird serialisiert zurückgegeben, also absolut und normalisiert. Ein eventuell vorhandenes Fragment (#abschnitt) wird dabei immer entfernt. Solange noch keine Antwort vorliegt oder die URL null ist, zum Beispiel vor dem Senden oder nach einem Netzwerkfehler, liefert die Eigenschaft einen leeren String "".
Typische Anwendungsfälle sind:
- Erkennen, ob eine Anfrage weitergeleitet wurde, etwa auf eine Login-Seite, weil die Sitzung abgelaufen ist.
- Relative Links in geladenen HTML- oder Markdown-Inhalten richtig auflösen.
- Protokollieren und Fehlersuche bei Weiterleitungsketten, z. B. von HTTP auf HTTPS oder beim Wechsel auf ein CDN.
Sinnvoll auslesen lässt sich der Wert ab readyState 2 (HEADERS_RECEIVED), spätestens im load-Ereignis.
Rückgabewert
null, ergibt sich ein leerer String "".Beispiele
Endgültige URL nach einer Weiterleitung auslesen
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://httpbin.org/redirect-to?url=/get');
xhr.addEventListener('load', () => {
console.log('Status:', xhr.status);
console.log('Antwort-URL:', xhr.responseURL);
});
xhr.send();
Abgelaufene Sitzung erkennen (Weiterleitung auf die Login-Seite)
const loadDashboardData = () => new Promise((resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/dashboard');
xhr.responseType = 'json';
xhr.onload = () => {
const finalPath = new URL(xhr.responseURL).pathname;
if (finalPath.startsWith('/login')) {
reject(new Error('Sitzung abgelaufen – bitte neu anmelden'));
return;
}
resolve(xhr.response);
};
xhr.onerror = () => reject(new Error('Netzwerkfehler'));
xhr.send();
});
try {
const data = await loadDashboardData();
console.log(data);
} catch (err) {
console.warn(err.message);
window.location.href = '/login';
}
Relative Links im geladenen HTML auflösen
const xhr = new XMLHttpRequest();
xhr.open('GET', '/docs/latest');
xhr.responseType = 'document';
xhr.onload = () => {
// Basis ist die tatsächliche URL, z. B. /docs/v3.2/ nach einer Weiterleitung
const base = xhr.responseURL;
const links = [...xhr.response.querySelectorAll('a[href]')]
.map((a) => new URL(a.getAttribute('href'), base).href);
console.log(links.slice(0, 2));
};
xhr.send();
Wert vor dem Senden und nach einem Fehler
const xhr = new XMLHttpRequest();
xhr.open('GET', 'https://ungueltige-domain.invalid/daten#teil');
console.log(JSON.stringify(xhr.responseURL)); // noch keine Antwort
xhr.onerror = () => {
console.log(JSON.stringify(xhr.responseURL)); // Netzwerkfehler
};
xhr.send();
// Wichtig · Fallstricke
- Fragment wird entfernt: Ein
#hashaus der angefragten URL erscheint nie inresponseURL. - Leerer String statt
null: Vor dem Empfang der Header, beiabort()und bei Netzwerk- oder CORS-Fehlern ist der Wert"". Deshalb vornew URL(xhr.responseURL)prüfen, ob der String leer ist, sonst wirft der Konstruktor einenTypeError. - Weiterleitungen sind nicht einzeln sichtbar: Nur die letzte URL ist verfügbar, Zwischenschritte und der Weiterleitungsstatus (z. B. 302) lassen sich nicht auslesen. Weiterleitungen, die der Server mit Meta-Refresh oder JavaScript auslöst, werden nicht erfasst.
- CORS: Bei ursprungsübergreifenden Weiterleitungen muss jedes Ziel CORS korrekt erlauben. Sonst schlägt die Anfrage fehl und
responseURLbleibt leer. - Kompatibilität: Wird von allen modernen Browsern unterstützt (Chrome 37+, Firefox 32+, Safari 8+, Edge), aber nicht vom Internet Explorer. Dort ist die Eigenschaft
undefined. In neuem Code ist oftfetch()mitResponse.urlundResponse.redirecteddie bessere Wahl.