Lösung von "URIError: URI malformed" und häufigen URL-Fehlern: Ein vollständiger Leitfaden
URLs (Uniform Resource Locators) sind die Adressen des Webs. Obwohl sie einfach erscheinen, gibt es strenge Regeln dafür, welche Zeichen erlaubt sind. Wenn diese Regeln verletzt werden, treten Fehler wie URIError: URI malformed, TypeError: Failed to construct 'URL': Invalid URL oder einfach ein kaputter Link auf, der zu einem 404-Fehler führt.
In diesem Leitfaden werden wir uns mit den häufigsten URL-bezogenen Fehlern befassen und zeigen, wie man sie in JavaScript und anderen Umgebungen löst.
1. Häufige URL-Fehlermeldungen
Je nachdem, was Sie tun, können folgende Fehler auftreten:
- JavaScript (decodeURIComponent):
URIError: URI malformed - JavaScript (new URL()):
TypeError: Failed to construct 'URL': Invalid URL - Python (urllib):
ValueError: Invalid URL - Java (URLDecoder):
java.lang.IllegalArgumentException: URLDecoder: Incomplete % sequence
2. Hauptursachen und Lösungen
2.1 "URIError: URI malformed"
Dieser Fehler tritt in JavaScript auf, wenn decodeURI() oder decodeURIComponent() auf eine ungültige Prozent-Kodierungssequenz (percent encoding error) stößt. Dies passiert normalerweise, wenn auf ein %-Zeichen nicht zwei hexadezimale Ziffern folgen oder wenn die Sequenz ein ungültiges UTF-8-Zeichen darstellt.
Der Fehler:
decodeURIComponent("%") // URIError: URI malformed
decodeURIComponent("%E0%A4%A") // URIError: URI malformed (Unvollständig)
Die Lösung:
- Einzelne %-Zeichen maskieren: Wenn Ihr String literale
%-Zeichen enthält, die nicht Teil einer kodierten Sequenz sind, müssen Sie diese als%25maskieren. - Auf Kürzungen prüfen: Stellen Sie sicher, dass die URL nicht mitten in einer Sequenz abgeschnitten wurde (z. B. durch ein Datenbankfeldlimit oder einen zu langen Abfrageparameter).
- Try-Catch verwenden: Schließen Sie die Dekodierung immer in einen Try-Catch-Block ein.
function safeDecode(str) {
try {
return decodeURIComponent(str);
} catch (e) {
console.error("Malformed URL (Fehlerhafte URL):", str);
return str; // Original-String zurückgeben, wenn Dekodierung fehlschlägt
}
}
2.2 encodeURI vs. encodeURIComponent
Ein häufiger Fehler ist die Verwendung der falschen Kodierungsfunktion, was zu invalid URL-Fehlern führt, wenn der Server die Anfrage erhält.
encodeURI(): Wird für die gesamte URL verwendet. Es kodiert KEINE Zeichen, die eine spezielle Bedeutung in einer URL-Struktur haben (wie:,/,?,#,&,=).encodeURIComponent(): Wird für einzelne Parameter verwendet (wie eine Suchanfrage oder ein Dateiname). Es kodiert alles außer ein paar Basiszeichen.
Der Fehler:
const url = "https://example.com/search?q=" + encodeURI("blau/grün");
// Ergebnis: https://example.com/search?q=blau/grün (Das / bricht den Parameter)
Der richtige Weg:
const url = "https://example.com/search?q=" + encodeURIComponent("blau/grün");
// Ergebnis: https://example.com/search?q=blau%2Fgr%C3%BCn (Korrekt!)
2.3 "TypeError: Invalid URL"
Dies passiert, wenn Sie dem URL-Konstruktor einen String übergeben, der keine gültige absolute URL ist (z. B. wenn das Protokoll wie https:// fehlt).
Der Fehler:
new URL("www.google.com") // TypeError: Invalid URL
Die Lösung: Stellen Sie sicher, dass die URL absolut ist, oder geben Sie eine Basis-URL als zweites Argument an.
new URL("https://www.google.com") // Korrekt
new URL("/pfad", "https://example.com") // Korrekt
2.4 Prozent-Kodierungsfehler (Leerzeichen und Sonderzeichen)
URLs dürfen keine Leerzeichen enthalten. Während einige Browser Leerzeichen automatisch in %20 oder + umwandeln, ist es riskant, sich darauf zu verlassen.
Die Lösung: Kodieren Sie dynamische Daten immer.
- Leerzeichen ->
%20(Standard) - Leerzeichen ->
+(Nur in Query-Strings gültig, wie?q=hallo+welt)
3. Fortgeschrittene Fehlerbehebung
3.1 Doppelkodierung (Double Encoding)
Wenn Sie einen String zweimal kodieren, entsteht ein Chaos. Zum Beispiel wird aus einem Leerzeichen %20, und daraus dann %2520.
Lösung: Verfolgen Sie, wo die Kodierung stattfindet. Kodieren Sie Daten nur einmal, direkt bevor Sie sie an die URL anhängen.
3.2 Nicht-UTF-8-Kodierungen
Das moderne Web verwendet UTF-8. Wenn Sie auf ein altes System stoßen, das GBK oder Latin1 für URL-Parameter verwendet, wird decodeURIComponent fehlschlagen oder "Mojibake" (Zeichensalat) erzeugen.
Lösung: Möglicherweise benötigen Sie eine Bibliothek wie iconv-lite, um alte Kodierungen zu verarbeiten, bevor Sie die URL verarbeiten.
4. Prävention und Best Practices
- Verwenden Sie die
URL-API: Verwenden Sie anstelle von manueller String-Verkettung die integriertenURL- undURLSearchParams-APIs. Diese handhaben die Kodierung automatisch und korrekt. - Seien Sie spezifisch: Verwenden Sie
encodeURIComponentfür Parameterwerte undencodeURIfür den Basispfad. - Eingaben bereinigen: Wenn Benutzer URLs angeben, validieren Sie diese mit dem
URL-Konstruktor in einem Try-Catch-Block.
function isValidUrl(string) {
try {
new URL(string);
return true;
} catch (_) {
return false;
}
}
5. FAQ: Häufig gestellte Fragen
F: Was ist der Unterschied zwischen %20 und + für Leerzeichen?
A: %20 ist die Standardkodierung für ein Leerzeichen in jedem Teil eines URIs. + ist eine veraltete Konvention speziell für Query-Parameter (application/x-www-form-urlencoded). Verwenden Sie %20 für maximale Kompatibilität.
F: Warum sehe ich %25 in meiner URL?
A: %25 ist die kodierte Version des %-Zeichens selbst. Dies passiert normalerweise, wenn eine bereits kodierte URL erneut kodiert wird (Doppelkodierung).
F: Wie gehe ich mit URLs um, die Emojis oder nicht-lateinische Zeichen enthalten?
A: Verwenden Sie immer encodeURIComponent. Es konvertiert Unicode-Zeichen korrekt in eine Sequenz von UTF-8-Bytes und kodiert dann jedes Byte mittels Prozentkodierung.
6. Schnellcheck-Tool
Haben Sie Probleme mit einer malformed URL? Nutzen Sie unseren URL-Encoder & Decoder. Er kann:
- Sofort validieren, ob eine URL wohlgeformt ist.
- Ergebnisse von
encodeURIundencodeURIComponentvergleichen. - Komplexe Query-Strings sicher dekodieren.
- Internationalisierte Domainnamen (IDN) handhaben.
Ähnliche Fehler
- Lösung von 'Unexpected token in JSON'-Fehlern
- Behebung von 'invalid base64 string'-Fehlern
- URIError: URI malformed verstehen