Position actuelle: Accueil> Derniers articles> Comment gérer Parse_url qui ne peut pas identifier correctement les chemins relatifs

Comment gérer Parse_url qui ne peut pas identifier correctement les chemins relatifs

gitbox 2025-05-27

Lorsque vous utilisez PHP pour le développement Web quotidien, Parse_Url () est une fonction très courante pour analyser les URL et obtenir divers composants. Cependant, de nombreux développeurs rencontreront des résultats inattendus lors de l'utilisation de cette fonction pour traiter les "chemins relatifs", et peuvent même douter de savoir s'il y a un bug dans cette fonction. En fait, le problème n'est pas que parse_url () lui-même, mais que nous avons des malentendus sur son scénario d'utilisation.

Cet article vous emmènera dans une compréhension approfondie du comportement de parse_url () et comment gérer correctement les chemins relatifs.

1. Problème Contexte

La description officielle de parse_url () indique clairement que les paramètres de cette fonction doivent être une URL légale. Autrement dit, il convient plus à l'analyse des URL absolues . Si vous passez dans un chemin relatif, le résultat renvoyé peut ne pas être ce que vous attendez.

Jetons un coup d'œil à un exemple:

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

Sortir:

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

Vous constaterez que parse_url () ne se sépare pas ? Foo = bar et #section , mais traite la chaîne entière comme un chemin. La raison en est que le entrant est un chemin relatif, et parse_url () ne sait pas comment diviser correctement ces parties.

2. Correction de la façon de gérer les chemins relatifs

Si vous avez besoin d'analyser une chaîne de requête ou un fragment (#) dans un chemin relatif, un moyen viable est de le convertir en une URL absolue d'abord. Il peut être implémenté en épissant un protocole virtuel et un nom d'hôte, tels que:

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

// Supprimer Forged scheme et host
unset($parts['scheme'], $parts['host']);

var_dump($parts);

Sortir:

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

De cette façon, nous pouvons obtenir les résultats que nous voulons.

3. encapsuler davantage les fonctions de traitement

Si vous rencontrez souvent ce type de scénario, vous pouvez encapsuler une fonction d'assistance pour gérer les chemins relatifs:

 function parse_relative_url($url) {
    // Le cas échéant / Le chemin pour commencer,Forger un nom de domaine à ajouter
    if (strpos($url, '/') === 0) {
        $url = 'http://gitbox.net' . $url;
        $parts = parse_url($url);
        unset($parts['scheme'], $parts['host']);
        return $parts;
    }

    // Si c'est un autre format,Vous pouvez choisir de continuer à analyser ou de lancer une exception
    throw new InvalidArgumentException("Only relative paths starting with '/' are supported.");
}

Exemple d'appel:

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

Sortir:

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

4. Résumé

PARSE_URL () est très fiable lors de l'analyse des URL absolues, mais a des performances limitées face à des chemins relatifs. En épissant temporairement un faux nom de domaine, vous pouvez contourner cette restriction, vous permettant d'obtenir toujours des informations telles que la requête et le fragment.

Ce n'est pas un hack, mais une réponse raisonnable aux limites de la conception de la fonction. Comprendre les limites des outils est plus important que de douter aveuglément si les outils ont des bogues. J'espère que cet article peut vous aider à obtenir moins de pièges!