W3docs

$_SERVER

Découvrez $_SERVER en PHP : les clés les plus utiles, la gestion des formulaires, les redirections et la sécurité des valeurs côté client.

Comprendre les superglobales PHP et la variable $_SERVER

PHP est un langage de script côté serveur très répandu pour le développement web. L'une de ses fonctionnalités est l'ensemble des superglobales — des variables intégrées toujours disponibles dans toutes les portées, sans qu'il soit nécessaire de les déclarer avec le mot-clé global. Cet article se concentre sur la superglobale $_SERVER : ce qu'elle contient, les clés les plus utilisées et comment la lire en toute sécurité.

Pour un aperçu de toutes les superglobales ($_GET, $_POST, $_SESSION, $_COOKIE, et d'autres), consultez PHP Superglobals.

Qu'est-ce que la variable $_SERVER ?

$_SERVER est un tableau associatif que le serveur web remplit à chaque requête. Il contient des informations sur le serveur, le script en cours d'exécution et la requête HTTP entrante — en-têtes, chemins, méthode de requête, adresse IP du visiteur et certaines variables d'environnement système.

Comme il s'agit d'un tableau, vous lisez les informations individuelles par clé, par exemple $_SERVER['REQUEST_METHOD'].

Clés couramment utilisées

CléCe qu'elle retourne
$_SERVER['REQUEST_METHOD']La méthode HTTP de la requête (GET, POST, PUT, …).
$_SERVER['REQUEST_URI']Le chemin et la chaîne de requête de l'URL demandée, ex. /products?id=5.
$_SERVER['QUERY_STRING']Uniquement la partie chaîne de requête de l'URL, ex. id=5.
$_SERVER['HTTP_HOST']L'hôte (et le port) issus de l'en-tête Host de la requête.
$_SERVER['SERVER_NAME']Le nom d'hôte tel que configuré sur le serveur lui-même.
$_SERVER['HTTPS']Non vide lorsque la requête a été effectuée via HTTPS.
$_SERVER['REMOTE_ADDR']L'adresse IP depuis laquelle la requête semble provenir.
$_SERVER['HTTP_USER_AGENT']L'en-tête User-Agent du client (identité du navigateur/bot).
$_SERVER['HTTP_REFERER']L'URL de la page ayant lié au script actuel, le cas échéant.
$_SERVER['SCRIPT_FILENAME']Chemin absolu du système de fichiers du script en cours d'exécution.
$_SERVER['DOCUMENT_ROOT']Répertoire racine du document configuré pour le site.
$_SERVER['PHP_SELF']Chemin du script actuel relatif à la racine du document.
$_SERVER['SERVER_PROTOCOL']Protocole de la requête, ex. HTTP/1.1.

Remarque : Les clés présentes dépendent du serveur web (Apache, Nginx + PHP-FPM, le serveur CLI intégré, …). En ligne de commande, de nombreuses clés liées aux requêtes sont totalement absentes. Lisez toujours avec précaution — voir la section sécurité ci-dessous.

Inspecter $_SERVER

Lorsque vous n'êtes pas sûr de ce que fournit un environnement donné, affichez le tableau entier :

<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';

Cela affiche chaque paire clé/valeur mise à disposition par le serveur pour la requête en cours, ce qui est le moyen le plus rapide de découvrir ce sur quoi vous pouvez compter.

Brancher sur la méthode de requête

Un usage très courant de $_SERVER consiste à décider quoi faire selon la façon dont la page a été demandée. Une page de formulaire, par exemple, affiche le formulaire lors d'une requête GET et traite les données soumises lors d'une requête POST :

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Handle the submitted form data (validate, save, …)
    echo 'Processing your submission';
} else {
    // First visit — show the empty form
    echo 'Showing the form';
}

Ce modèle est le fondement de la gestion des formulaires en PHP. Consultez PHP Form Handling et PHP Form Validation pour le flux complet.

Construire une URL de redirection

La fonction header() envoie un en-tête HTTP brut — y compris l'en-tête Location utilisé pour les redirections. $_SERVER est utile pour construire la destination dynamiquement, par exemple pour forcer HTTPS sur la requête en cours :

<?php
// Redirect to the HTTPS version of the same URL when the request is plain HTTP
if (empty($_SERVER['HTTPS'])) {
    $url = 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    header('Location: ' . $url, true, 301);
    exit;
}

header() doit être appelée avant tout envoi de sortie (HTML, echo, ou même une ligne vide) vers le navigateur. L'instruction exit arrête le script afin qu'aucun contenu supplémentaire ne soit produit après l'en-tête de redirection.

Utilisation de $_SERVER pour la gestion des erreurs

Une autre utilisation de la variable $_SERVER concerne la gestion des erreurs. Par exemple, vous pouvez utiliser le code suivant pour afficher une page d'erreur personnalisée pour les erreurs 404 :

Gestion des erreurs 404 en PHP avec $_SERVER

<?php
// Log the error URI using $_SERVER
error_log('404 Error: ' . $_SERVER['REQUEST_URI']);
http_response_code(404);
include '404.html';
?>

Dans cet exemple, $_SERVER['REQUEST_URI'] est utilisé pour capturer le chemin demandé à des fins de journalisation. Au lieu de rediriger, le script définit le code de statut HTTP correct et inclut un modèle personnalisé, ce qui est la pratique standard pour gérer les erreurs.

Sécurité : ne faites pas confiance aux valeurs contrôlées par le client

Certaines clés de $_SERVER proviennent de la requête et sont entièrement contrôlées par le client, elles peuvent donc être falsifiées. Traitez-les comme des entrées non fiables :

  • HTTP_HOST, HTTP_REFERER, HTTP_USER_AGENT et toute autre clé HTTP_* ne sont que des en-têtes de requête — un client malveillant peut envoyer n'importe quoi. Ne les affichez jamais dans du HTML sans échappement (utilisez htmlspecialchars()), et validez HTTP_HOST par rapport à une liste autorisée avant de l'utiliser dans une redirection.
  • PHP_SELF peut contenir des données de chemin injectées et constitue une source classique de cross-site scripting (XSS) lorsqu'il est affiché dans l'attribut action d'un formulaire. Échappez-le.
  • REMOTE_ADDR est l'adresse de connexion ; derrière un proxy ou un équilibreur de charge, l'adresse IP réelle du client peut se trouver dans un en-tête différent. Ne vous fiez pas uniquement à REMOTE_ADDR pour les décisions de sécurité.

Une manière sûre de vérifier l'absence d'une clé sans avertissement est l'opérateur de fusion nulle :

<?php
$method = $_SERVER['REQUEST_METHOD'] ?? 'GET';
echo $method;

Cela évite un avertissement "undefined array key" lorsque la clé n'est pas définie (par exemple lors d'une exécution sous CLI).

Conclusion

La superglobale $_SERVER donne aux scripts PHP accès aux détails de la requête et de l'environnement — la méthode HTTP, l'URL demandée, l'hôte, les chemins et l'adresse IP du visiteur. Elle est au cœur des tâches quotidiennes telles que la gestion des formulaires selon la méthode, les redirections et la journalisation des erreurs. N'oubliez pas que les clés dérivées des en-têtes sont contrôlées par le client : validez-les et échappez-les avant utilisation.

Pour aller plus loin, explorez les superglobales associées : $_GET, $_POST et $_REQUEST.

Remarque : En PHP moderne, la balise de fermeture ?> est facultative et souvent omise pour éviter toute sortie d'espace blanc accidentelle.

Pratique

Pratique
Quelles informations la superglobale PHP $_SERVER peut-elle fournir ?
Quelles informations la superglobale PHP $_SERVER peut-elle fournir ?
Was this page helpful?