URL complet en PHP : comment l'obtenir rapidement et sans erreurs

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Comment obtenir l'URL complet en PHP sans perdre la tête ?

\n\n

Chaque développeur PHP a déjà été confronté à la question : « Comment obtenir l'URL complet de la page actuelle ? ». Cela semble simple — prendre $_SERVER['HTTP_HOST'], ajouter $_SERVER['REQUEST_URI'] — et le tour est joué. Mais la réalité, comme toujours, apporte ses corrections. HTTP ou HTTPS ? Et si le port n'est pas standard ? Et si le site est derrière un proxy ? Et si on ne veut pas seulement l'obtenir, mais le faire rapidement, sans fuites mémoire et en prévision du futur ?

\n\n

La question « Get the full URL in PHP » sur Stack Overflow a recueilli des milliers de vues et des dizaines de réponses. Ce n'est pas un hasard : le sujet semble simple, mais les pièges sont nombreux comme dans une flaque printanière. Aujourd'hui, nous allons voir non seulement « comment faire », mais comment le faire correctement, rapidement et de manière fiable. C'est parti !

\n\n

Pourquoi la simple copie depuis $_SERVER est-elle néfaste ?

\n\n

Les développeurs débutants écrivent souvent ceci :

\n\n
$url = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
\n\n

À première vue, cela fonctionne. Mais examinons les problèmes :

\n
    \n
  • Pas de HTTPS. Si le site fonctionne en HTTPS, vous obtiendrez http:// — et le navigateur se plaindra de contenu mixte.
  • \n
  • Port. Si le port n'est pas standard (par exemple 8080), il sera perdu si vous n'utilisez pas $_SERVER['SERVER_PORT'].
  • \n
  • Proxy et équilibreurs de charge. Derrière un proxy inverse (Nginx, Cloudflare), $_SERVER['HTTP_HOST'] peut ne pas correspondre à ce que voit l'utilisateur.
  • \n
  • Sécurité. La valeur de HTTP_HOST peut être usurpée par un attaquant (Host header injection).
  • \n
\n\n

Bref, le copier-coller depuis la première réponse sur Stack Overflow n'est pas la meilleure solution. Écrivons une fonction correcte et performante.

\n\n

Fonction de référence : obtenir l'URL complet correctement

\n\n

Voici une fonction fiable qui prend en compte tous les scénarios principaux :

\n\n
function getFullUrl(): string {\n    $protocol = 'http';\n    if (\n        (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')\n        || (int)$_SERVER['SERVER_PORT'] === 443\n    ) {\n        $protocol = 'https';\n    }\n\n    // Prise en compte des en-têtes du proxy (si on lui fait confiance)\n    $host = $_SERVER['HTTP_HOST'] ?? '';\n    if (empty($host) && !empty($_SERVER['SERVER_NAME'])) {\n        $host = $_SERVER['SERVER_NAME'];\n    }\n\n    // Vérification du port\n    $port = (int)$_SERVER['SERVER_PORT'];\n    $portSuffix = '';\n    if (\n        ($protocol === 'http' && $port !== 80)\n        || ($protocol === 'https' && $port !== 443)\n    ) {\n        $portSuffix = ':' . $port;\n    }\n\n    $uri = $_SERVER['REQUEST_URI'] ?? '/';\n\n    return $protocol . '://' . $host . $portSuffix . $uri;\n}
\n\n

Qu'est-ce qui est important ici ?

\n
    \n
  • Nous vérifions HTTPS — méthode standard, fonctionne dans 99% des cas.
  • \n
  • Nous prenons en compte SERVER_PORT — si le site est sur un port non standard, nous ne le perdons pas.
  • \n
  • Option de secours via SERVER_NAME — au cas où HTTP_HOST serait vide.
  • \n
  • Nous n'utilisons pas $_SERVER['SCRIPT_URI'] — il n'est pas présent partout.
  • \n
\n\n

Optimisation des performances : quand chaque milliseconde compte

\n\n

Si vous appelez cette fonction sur chaque page ou dans une boucle, il faut penser à la vitesse. Voici quelques astuces :

\n\n

1. Mise en cache du résultat

\n

Si l'URL ne change pas au cours d'une même requête (et elle ne change pas), mettez-la en cache :

\n\n
function getFullUrlCached(): string {\n    static $url = null;\n    if ($url === null) {\n        $url = getFullUrl(); // on utilise notre fonction ci-dessus\n    }\n    return $url;\n}
\n\n

Une variable statique conserve la valeur après le premier appel — pas de calculs répétés.

\n\n

2. Évitez les opérations inutiles

\n

N'utilisez pas filt

Blogs

Book Recommendations