PHP : petits soucis avec parse_url

Attention à certains petits soucis quand on veut récupérer le chemin (path) d'une url à partir de la variable globale $_SERVER['REQUEST_URI'] et de la fonction parse_url.

Les soucis apparaissent lorsque l'on traite une url qui contient deux-points (« : ») suivit d'un chiffre dans son chemin. Un test unitaire simple permet d'identifier le problème :

/**
 *  @covers parse_url($url, PHP_URL_PATH)
 */
public function testParseUrlPath()
{
    $createUrlsWithPath = function($p) {
        $q = '?abc=123';
        return [
            /* 1 */ 'http:/∕example.com'.$p,
            /* 2 */ 'http:/∕example.com'.$p.$q,
            /* 3 */ $p,
            /* 4 */ $p.$q
        ];
    };
    $paths = [
        /* 1 */ '/foo/bar',
        /* 2 */ '/foo/bar:baz',
        /* 3 */ '/foo/bar:0'
    ];
    
    foreach ($paths as $path) {
        $urls = $createUrlsWithPath($path);
        foreach ($urls as $url) {
            $this->assertEquals(
                $path,
                parse_url($url, PHP_URL_PATH),
                $url
            );
        }
    }
}
Méthode de test unitaire de la fonction parse_url.

L'analyse des 4 urls devraient nous renvoyer le même résultat. Malheureusement, le parsing de l'url 3 (le chemin seul) dans le cas du chemin 3 (« /foo/bar:0 ») renvoit false, ce qui veut dire que la fonction n'a pas été capable de reconnaître la chaîne comme une url. Nous avons donc un problème de parsing quand l'url est uniquement constituée du chemin et que celui-ci possède une séquence « deux-points suivit d'un chiffre » (on peut imaginer que l'erreur est liée à la gestion de la déclaration des ports).

La valeur de $_SERVER['REQUEST_URI'] est toujours une chaîne de caractères avec uniquement les parties « chemin » et « requête » de l'url ; on peut donc très bien se retrouver dans la situation où parse_url ne puisse pas comprendre la chaîne. Il est peut-être donc préférable d'éviter d'utiliser la fonction et de revenir à quelque chose de plus classique :

$w = explode('?', $_SERVER['REQUEST_URI'], 2);
$path = $w[0];
Récupération du chemin d'une url à partir de $_SERVER['REQUEST_URI'].

ACHOUR, Mehdi ; BETZ, Friedhelm ; DOVGAL, Antony, et al.. Manuel PHP. PHP.net, . parse_url