Start · Sprachen · JavaScript · Referenz · URLPattern.hostname

URLPattern.hostname

Eigenschaft

Nur lesbare Eigenschaft, die das normalisierte Muster als String liefert, mit dem ein <code>URLPattern</code> den Hostnamen-Teil einer URL prüft.

seit JavaScript Chromium 95+, Firefox 142+, Safari 26+, Node.js 23 Kategorie: webapi

Signatur

URLPattern.hostname

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

Typ
string
Beschreibung
Das normalisierte Muster für den Hostnamen, z. B. "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);
:sub.example.com /books/:id

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"));
* true

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}`);
}
Hostnamen-Muster: :tenant.app.example.com Mandant: acme

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" }));
{*.}?example.com true true false

// 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 einen TypeError aus. Für ein anderes Muster muss ein neues URLPattern erzeugt werden.
  • Platzhalter und Subdomains: *.example.com passt nicht auf example.com selbst. Sollen beide passen, verwende {*.}?example.com.
  • Port gehört nicht dazu: Der Port ist ein eigener Teil des Musters (URLPattern.port). hostname enthä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.com verwenden. Dieses Muster passt auch auf evilexample.com.
  • Kompatibilität: URLPattern gibt 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 Polyfill urlpattern-polyfill. Prüfe die Verfügbarkeit mit "URLPattern" in globalThis.