Fonction PHP header() : Tout ce que vous devez savoir
Apprenez à utiliser la fonction header() en PHP pour les redirections, le type de contenu, le téléchargement de fichiers et le contrôle du cache.
Chaque réponse HTTP envoyée par un serveur web comporte deux parties : un ensemble d'en-têtes (métadonnées telles que le type de contenu, les règles de mise en cache et le code d'état) suivi du corps de la réponse (le HTML, JSON, l'image ou le fichier que le navigateur reçoit). La fonction header() de PHP vous permet d'écrire ces en-têtes depuis votre script — pour rediriger les utilisateurs, proposer des téléchargements, définir le type de contenu, contrôler la mise en cache et envoyer des codes d'état personnalisés.
Ce guide couvre la syntaxe et les paramètres de header(), la règle qui piège presque tout le monde (l'erreur "headers already sent"), ainsi que les recettes les plus courantes en pratique.
Qu'est-ce que la fonction header() ?
header() est une fonction PHP intégrée qui envoie un en-tête HTTP brut au client. Un en-tête est une ligne telle que Content-Type: text/html ou Location: /login que le navigateur lit avant le corps de la page. Comme les en-têtes arrivent en premier dans la réponse, header() ne fonctionne que pendant que PHP construit encore cette section d'en-tête — voir la règle "headers already sent" ci-dessous.
Syntaxe et paramètres
header(string $header, bool $replace = true, int $response_code = 0): void| Paramètre | Type | Description |
|---|---|---|
$header | string | La ligne d'en-tête à envoyer, p. ex. "Content-Type: application/json". |
$replace | bool | Indique si cet appel remplace un en-tête précédent du même nom. Avec false, plusieurs en-têtes du même nom sont envoyés. Par défaut à true. |
$response_code | int | Force le code d'état HTTP de la réponse. 0 (valeur par défaut) signifie "laisser le statut inchangé". |
La fonction ne retourne rien (void). Elle n'indique pas si l'en-tête a été accepté — si une sortie a déjà été envoyée, elle lève un avertissement à la place.
Définir un en-tête
L'utilisation la plus simple consiste à déclarer le type de contenu que la réponse contient. C'est indispensable lorsque votre script retourne du JSON, du XML, du texte brut ou un fichier au lieu de HTML :
<?php
header("Content-Type: application/json");
echo json_encode(["status" => "ok", "id" => 42]);L'en-tête Content-Type indique au navigateur de traiter le corps comme du JSON, de sorte qu'il analyse {"status":"ok","id":42} comme des données plutôt que de l'afficher comme une page web.
La règle "headers already sent"
C'est la chose la plus importante à savoir sur header() : elle doit être appelée avant tout envoi de sortie depuis votre script. La sortie comprend le HTML, echo/print, var_dump(), et même un espace parasite ou une ligne vide avant la balise ouvrante <?php. Dès qu'un octet du corps a été envoyé, la section d'en-tête est fermée et PHP lève :
Warning: Cannot modify header information - headers already sentVous disposez de deux façons de l'éviter :
<?php
// 1. Check first — useful when a header is optional
if (!headers_sent()) {
header("X-Powered-By: MyApp");
}
// 2. Buffer output so nothing is flushed until you choose to
ob_start(); // capture everything that gets echoed
echo "page content...";
header("X-Cache: MISS"); // still works — body is held in the buffer
ob_end_flush(); // now send headers + buffered body togetherUne cause fréquente est un éditeur qui enregistre le fichier avec un BOM UTF-8 ou un saut de ligne après ?>. Omettre entièrement la balise fermante ?> dans les fichiers PHP purs est la méthode recommandée pour éviter cela.
Cas d'utilisation courants
Rediriger vers une autre URL
Envoyez un en-tête Location, puis arrêtez le script pour qu'aucun code supplémentaire ne s'exécute :
<?php
header("Location: https://example.com/login");
exit; // always exit after a redirectPar défaut, il s'agit d'une redirection 302 Found (temporaire). Pour un déplacement permanent, passez 301 comme code d'état afin que les moteurs de recherche mettent à jour leur index :
<?php
// 301 Moved Permanently
header("Location: https://example.com/new-page", true, 301);
exit;Envoyer un code d'état personnalisé
Vous pouvez définir un statut sans rediriger — pour une API retournant "not found", par exemple :
<?php
header("HTTP/1.1 404 Not Found");
// or, more portably:
header("Status: 404 Not Found", true, 404);
echo "Resource not found";Pour les codes d'état spécifiquement, la fonction dédiée http_response_code() est plus claire et plus facile à lire.
Forcer le téléchargement d'un fichier
Combinez Content-Type avec Content-Disposition: attachment pour que le navigateur enregistre le fichier au lieu de l'afficher :
<?php
$file = "report.pdf";
header("Content-Type: application/pdf");
header("Content-Disposition: attachment; filename=\"$file\"");
header("Content-Length: " . filesize($file));
readfile($file); // stream the file to the client
exit;Voir readfile() pour diffuser le contenu du fichier vers la sortie.
Contrôler la mise en cache du navigateur
Les en-têtes vous permettent d'indiquer au navigateur s'il peut (et combien de temps) réutiliser une réponse :
<?php
// Tell the browser never to cache this response
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Expires: 0");Envoyer plusieurs en-têtes du même nom
La plupart des en-têtes remplacent le précédent du même nom. Définissez le deuxième argument à false lorsque vous avez genuinement besoin de plus d'un (rare, mais valide pour certains en-têtes) :
<?php
header("X-Sample: first");
header("X-Sample: second", false); // both X-Sample headers are sentFonctions associées
header() écrit un en-tête à la fois, mais PHP dispose d'outils de plus haut niveau pour les cas les plus courants :
setcookie()etsetrawcookie()— définissent un en-têteSet-Cookiesans le formater manuellement. Voir PHP Cookies.http_response_code()— lire ou définir le code d'état.- PHP Sessions —
session_start()envoie lui-même des en-têtes de cookie, il a donc la même exigence "avant la sortie".
Pour aller plus loin dans la définition et l'appel de vos propres fonctions, voir PHP Functions.
Conclusion
La fonction header() est votre accès direct aux en-têtes de réponse HTTP en PHP. Les règles sont simples : construisez la chaîne d'en-tête, appelez header() avant toute sortie, et utilisez exit après une redirection. Grâce à elle, vous pouvez rediriger les utilisateurs, définir des types de contenu, proposer des téléchargements, envoyer des codes d'état et contrôler la mise en cache — les briques fondamentales de presque toute réponse PHP dynamique.