Aktueller Standort: Startseite> Neueste Artikel> Wie man mit Parse_url umgeht, der die relativen Pfade nicht richtig identifizieren kann

Wie man mit Parse_url umgeht, der die relativen Pfade nicht richtig identifizieren kann

gitbox 2025-05-27

Bei der Verwendung von PHP für die tägliche Webentwicklung ist Parse_url () eine sehr häufige Funktion, um URLs zu analysieren und verschiedene Komponenten zu erhalten. Viele Entwickler werden jedoch auf unerwartete Ergebnisse stoßen, wenn diese Funktion zur Verarbeitung von "relativen Pfaden" verwendet werden, und möglicherweise sogar bezweifeln, ob in dieser Funktion einen Fehler aufweist. Tatsächlich ist das Problem nicht so, dass Parse_url () selbst, sondern dass wir Missverständnisse über das Nutzungsszenario haben.

In diesem Artikel werden Sie in ein tiefes Verständnis des Verhaltens von Parse_url () und zum richtigen Umgang mit relativen Pfaden führen.

1. Problemhintergrund

Die offizielle Beschreibung von Parse_url () besagt deutlich, dass die Parameter dieser Funktion eine legale URL sein sollten. Das heißt, es ist besser geeignet, absolute URLs zu analysieren. Wenn Sie einen relativen Weg übergeben, ist das zurückgegebene Ergebnis möglicherweise nicht das, was Sie erwartet haben.

Schauen wir uns ein Beispiel an:

 $url = "/path/to/resource?foo=bar#section";
var_dump(parse_url($url));

Ausgabe:

 array(1) {
  ["path"]=>
  string(19) "/path/to/resource?foo=bar#section"
}

Sie werden feststellen, dass Parse_url () nicht gespalten wird ? Foo = bar und #section , sondern behandelt die gesamte Zeichenfolge als Pfad. Der Grund dafür ist, dass das Eingang ein relativer Weg ist, und Parse_url () weiß nicht, wie diese Teile richtig teilnehmen sollen.

2. Richtiger Weg, um mit relativen Wegen umzugehen

Wenn Sie eine Abfragezeichenfolge oder einen Fragment (#) auf einen relativen Weg analysieren müssen, besteht ein praktikabler Weg darin, sie zuerst in eine absolute URL umzuwandeln. Es kann implementiert werden, indem ein virtuelles Protokoll und ein Hostname gespleißt werden, wie z. B.:

 $relativeUrl = "/path/to/resource?foo=bar#section";
$absoluteUrl = "http://gitbox.net" . $relativeUrl;
$parts = parse_url($absoluteUrl);

// Gefällt mir geschmiedet scheme Und host
unset($parts['scheme'], $parts['host']);

var_dump($parts);

Ausgabe:

 array(3) {
  ["path"]=>
  string(17) "/path/to/resource"
  ["query"]=>
  string(7) "foo=bar"
  ["fragment"]=>
  string(7) "section"
}

Auf diese Weise können wir die gewünschten Ergebnisse erzielen.

3.. Verarbeitungsfunktionen weiter verkapulieren

Wenn Sie häufig auf diese Art von Szenario stoßen, können Sie eine Helferfunktion zusammenschließen, um relative Pfade zu verarbeiten:

 function parse_relative_url($url) {
    // Wenn ja / Der Weg zu beginnen,Forge einen Domain -Namen zum Hinzufügen
    if (strpos($url, '/') === 0) {
        $url = 'http://gitbox.net' . $url;
        $parts = parse_url($url);
        unset($parts['scheme'], $parts['host']);
        return $parts;
    }

    // Wenn es ein anderes Format ist,Sie können wählen, ob Sie eine Ausnahme analysieren oder eine Ausnahme auswerfen sollen
    throw new InvalidArgumentException("Only relative paths starting with '/' are supported.");
}

Aufrufen Beispiel:

 $info = parse_relative_url('/test/path?x=1#top');
print_r($info);

Ausgabe:

 Array
(
    [path] => /test/path
    [query] => x=1
    [fragment] => top
)

4. Zusammenfassung

Parse_url () ist bei der Analyse von absoluten URLs sehr zuverlässig, hat jedoch nur eine begrenzte Leistung, wenn sie relative Wege konfrontiert. Durch das vorübergehende Spleißen eines gefälschten Domainnamens können Sie diese Einschränkung umgehen und es Ihnen ermöglichen, weiterhin Informationen wie Abfrage und Fragment zu erhalten.

Dies ist kein Hack, sondern eine vernünftige Antwort auf die Grenzen des Funktionsdesigns. Das Verständnis der Grenzen von Werkzeugen ist wichtiger, als blind zweifeln, ob Tools Fehler haben. Ich hoffe, dieser Artikel kann Ihnen helfen, weniger Fallen zu bekommen!