Start · Sprachen · JavaScript · Referenz · URL.protocol

URL.protocol

Eigenschaft

Liest oder setzt das Schema einer URL als String mit abschließendem Doppelpunkt, z. B. <code>"https:"</code>.

seit JavaScript Baseline: alle modernen Browser; Node.js 10+ (glob Kategorie: webapi

Signatur

URL.protocol

Beschreibung

Die Eigenschaft protocol eines URL-Objekts enthält das Schema der URL, immer in Kleinbuchstaben und mit abschließendem :, etwa "https:", "mailto:", "file:" oder "blob:". Die Eigenschaft lässt sich lesen und schreiben.

Typische Einsatzfälle: Man prüft, ob ein vom Benutzer eingegebener Link wirklich http: oder https: verwendet (Schutz vor javascript:-Links), leitet eine URL von http: auf https: oder von https: auf wss: um, oder unterscheidet Datei-, Daten- und Netzwerk-URLs.

Beim Setzen ist der Doppelpunkt optional: url.protocol = "https" und url.protocol = "https:" bewirken dasselbe. Ungültige Werte werden stillschweigend ignoriert, es gibt also keine Exception. Zwischen sogenannten speziellen Schemata (http, https, ws, wss, ftp, file) und nicht-speziellen Schemata (z. B. mailto, data, eigene Schemata) lässt sich nicht wechseln. Auch solche Zuweisungen haben keine Wirkung.

Parameter

Name Typ Default Beschreibung
$value string Nur beim Setzen: das neue Schema, mit oder ohne abschließendes :. Groß- und Kleinschreibung spielt keine Rolle, der Wert wird in Kleinbuchstaben gespeichert.

Rückgabewert

Typ
string
Beschreibung
Das Schema der URL in Kleinbuchstaben inklusive abschließendem :, z. B. "https:".

Beispiele

Protokoll auslesen

const urls = [
  'HTTPS://Example.org/pfad',
  'mailto:info@example.org',
  'file:///home/user/doc.txt',
  'ws://localhost:8080/socket'
];

for (const raw of urls) {
  console.log(new URL(raw).protocol);
}
https: mailto: file: ws:

Benutzer-Links auf sichere Schemata prüfen (XSS-Schutz)

const ERLAUBT = new Set(['http:', 'https:']);

const istSichererLink = (eingabe) => {
  try {
    return ERLAUBT.has(new URL(eingabe).protocol);
  } catch {
    return false; // keine gültige absolute URL
  }
};

console.log(istSichererLink('https://example.org'));
console.log(istSichererLink('javascript:alert(1)'));
console.log(istSichererLink('JaVaScRiPt:alert(1)'));
console.log(istSichererLink('kein link'));
true false false false

HTTP- in WebSocket-URL umwandeln

// Aus der Seiten-URL die passende WebSocket-URL ableiten
const toWebSocketUrl = (httpUrl) => {
  const url = new URL('/live', httpUrl);
  url.protocol = url.protocol === 'https:' ? 'wss' : 'ws';
  return url.href;
};

console.log(toWebSocketUrl('https://app.example.org/dashboard'));
console.log(toWebSocketUrl('http://localhost:3000/'));
wss://app.example.org/live ws://localhost:3000/live

Ungültige Zuweisungen werden ignoriert

const url = new URL('https://example.org/');

url.protocol = 'mailto';   // speziell -> nicht-speziell: ignoriert
console.log(url.protocol);

url.protocol = '1abc';     // ungültiges Schema: ignoriert
console.log(url.protocol);

url.protocol = 'HTTP';     // erlaubt, wird kleingeschrieben
console.log(url.href);
https: https: http://example.org/

// Wichtig · Fallstricke

  • Doppelpunkt beachten: Vergleiche wie url.protocol === 'https' sind immer false. Richtig ist 'https:'.
  • Stilles Scheitern: Ungültige Werte und Wechsel zwischen speziellen und nicht-speziellen Schemata lösen keinen Fehler aus. Nach dem Setzen sollte man den Wert daher bei Bedarf erneut prüfen. Ein Wechsel auf file: wird ebenfalls ignoriert, wenn die URL Zugangsdaten oder einen Port enthält.
  • Standardport: Wird das Protokoll gewechselt und entspricht der bisherige Port dem Standardport des neuen Schemas, entfernt der Parser den Port (z. B. http://x:443 → https://x/).
  • Sicherheit: Für die Prüfung von Benutzer-URLs immer über new URL() und protocol gehen, nicht per Regex oder startsWith() auf dem Rohstring. Der Parser normalisiert Großschreibung und führende Leerzeichen, wodurch sich z. B. " JavaScript:" sonst an einer Prüfung vorbeischmuggeln ließe. Setzen Sie ungeprüfte URLs nie in href oder src ein.
  • Kompatibilität: Wird von allen modernen Browsern unterstützt, in Node.js global ab Version 10. Gleichnamige Eigenschaften gibt es auch bei location.protocol und HTMLAnchorElement.protocol.