Signatur
Beschreibung
URLPattern.hostname gibt den Teil des Musters zurück, der für den Hostnamen einer URL gilt, zum Beispiel example.com, :sub.example.com oder {*.}?example.com. Den Wert legt der Konstruktor new URLPattern() fest: entweder aus einem Muster-String wie "https://*.example.com/*" oder aus dem Schlüssel hostname eines Objekts.
Die Eigenschaft ist nützlich, um ein Muster nachträglich zu prüfen, zu protokollieren oder zu debuggen. Ein Beispiel ist ein Router, der Routen für mehrere Subdomains verwaltet und anzeigen soll, welches Hostnamen-Muster zu einer Route gehört. Der Wert ist normalisiert. Er muss also nicht Zeichen für Zeichen mit der Eingabe übereinstimmen, etwa wenn der Parser Großbuchstaben in Kleinbuchstaben umwandelt oder Zeichen kodiert.
Wird im Objekt-Konstruktor kein hostname angegeben und keine baseURL übergeben, ist der Wert der Platzhalter "*". Dann passt jeder Hostname. Das eigentliche Prüfen übernehmen URLPattern.prototype.test() und URLPattern.prototype.exec(). Bei exec() stehen die Treffer für den Hostnamen unter result.hostname, also in input und groups.
Rückgabewert
"example.com", ":tenant.example.com" oder "*", wenn kein Hostname festgelegt wurde.Beispiele
Hostnamen-Muster aus einem Muster-String auslesen
const pattern = new URLPattern("https://:sub.example.com/books/:id");
console.log(pattern.hostname);
console.log(pattern.pathname);
Standardwert bei fehlendem Hostnamen
// Nur der Pfad wird vorgegeben, alle anderen Teile sind Platzhalter
const pattern = new URLPattern({ pathname: "/api/*" });
console.log(pattern.hostname);
console.log(pattern.test("https://irgendwas.de/api/users"));
Mandanten-Subdomain mit exec() auslesen
const tenantPattern = new URLPattern({
protocol: "https",
hostname: ":tenant.app.example.com",
pathname: "/*"
});
console.log(`Hostnamen-Muster: ${tenantPattern.hostname}`);
const result = tenantPattern.exec("https://acme.app.example.com/dashboard");
if (result) {
const { tenant } = result.hostname.groups;
console.log(`Mandant: ${tenant}`);
}
Domain mit und ohne Subdomain erfassen
// {*.}? macht die Subdomain samt Punkt optional
const pattern = new URLPattern({ hostname: "{*.}?example.com" });
console.log(pattern.hostname);
console.log(pattern.test({ hostname: "example.com" }));
console.log(pattern.test({ hostname: "api.example.com" }));
console.log(pattern.test({ hostname: "example.org" }));
// Wichtig · Fallstricke
- Nur lesbar: Die Eigenschaft hat nur einen Getter. Eine Zuweisung wie
pattern.hostname = "x"wird im nicht-strikten Modus stillschweigend ignoriert. Im strikten Modus, also auch in ES-Modulen, löst sie einenTypeErroraus. Für ein anderes Muster muss ein neuesURLPatternerzeugt werden. - Platzhalter und Subdomains:
*.example.compasst nicht aufexample.comselbst. Sollen beide passen, verwende{*.}?example.com. - Port gehört nicht dazu: Der Port ist ein eigener Teil des Musters (
URLPattern.port).hostnameenthält nie:8080. Ein Doppelpunkt im Hostnamen-Muster leitet eine benannte Gruppe ein. - Normalisierung: Der zurückgegebene String ist normalisiert, zum Beispiel durch Umwandlung in Kleinbuchstaben oder Kodierung. Vergleiche ihn deshalb nicht blind mit der ursprünglichen Eingabe.
- Sicherheit: Prüfungen der Herkunft, etwa für Weiterleitungen oder CORS-Logik, sollten keinen zu breiten Platzhalter wie
*example.comverwenden. Dieses Muster passt auch aufevilexample.com. - Kompatibilität:
URLPatterngibt es seit Chrome/Edge 95. In Firefox (ab 142) und Safari (ab 26) ist es erst seit Kurzem verfügbar, in Node.js ab 23.8 als globales Objekt. Für ältere Umgebungen gibt es das Polyfillurlpattern-polyfill. Prüfe die Verfügbarkeit mit"URLPattern" in globalThis.