Envoie un en-tête HTTP brut

# header

(PHP 4, PHP 5, PHP 7, PHP 8)

header — Envoie un en-tête HTTP brut

### Description

function header(string `$header`, bool `$replace` = `true`, int `$response_code` = 0): void

header() permet de spécifier l'en-tête HTTP `string` lors de l'envoi des fichiers HTML. Se reporter à » `HTTP/1.1 Specification` pour plus d'informations sur les en-têtes HTTP.

Il ne faut jamais oublier que header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichages PHP. Une erreur très classique est de lire un fichier avec include ou require, et de laisser des espaces ou des lignes vides, qui produiront un affichage avant que la fonction header() ne soit appelée. Le même problème existe avec les fichiers PHP/HTML standards.

    <html>
    <?php
    /* Ceci produira une erreur. Notez la sortie ci-dessus,
     * qui se trouve avant l'appel à la fonction header() */
    header('Location: http://www.example.com/');
    exit;
    ?>

### Liste de paramètres

`header`

  L'en-tête.

  Il y a deux en-têtes spéciaux. Le premier commence par la chaîne "`HTTP/`" (insensible à la casse), qui est utilisée pour signifier le statut HTTP à envoyer. Par exemple, si on a configuré Apache pour utiliser les scripts PHP pour gérer les requêtes vers des fichiers inexistants (en utilisant la directive `ErrorDocument`), il faut s'assurer que le script génère un code statut correct.

      <?php
      // Cet exemple illustre le cas spécial "HTTP/"
      // De meilleures alternatives dans les cas d'utilisation typiques incluent :
      // 1. header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");
      //    (pour surcharger les messages de statut HTTP pour les clients qui utilisent encore HTTP/1.0)
      // 2. http_response_code(404); (pour utiliser le message par défaut)
      header("HTTP/1.1 404 Not Found");
      ?>

  Le deuxième type d'appel spécial est `"Location:"`. Non seulement il renvoie un en-tête au client, mais, en plus, il envoie un statut `REDIRECT` (302) au navigateur tant qu'un code statut `201` ou `3xx` n'a pas été envoyé.

      <?php
      header("Location: http://www.example.com/"); /* Redirection du navigateur */

      /* Assurez-vous que la suite du code ne soit pas exécutée une fois la redirection effectuée. */
      exit;
      ?>

`replace`

  Le paramètre optionnel `replace` indique si la fonction header() doit remplacer un en-tête précédemment émis, ou bien ajouter un autre en-tête du même type. Par défaut, un nouvel en-tête va écraser le précédent, mais si on passe `false` dans cet argument, l'on peut forcer les en-têtes multiples pour un même type d'en-tête. Par exemple :

      <?php
      header('WWW-Authenticate: Negotiate');
      header('WWW-Authenticate: NTLM', false);
      ?>

`response_code`

  Force le code réponse HTTP à la valeur spécifiée. À noter que ce paramètre a un effet uniquement si `header` n'est pas vide.

### Valeurs de retour

Aucune valeur n'est retournée.

### Erreurs / Exceptions

Lors de l'échec de la planification de l'envoi d'un en-tête, header() lève une erreur de niveau `E_WARNING`.

### Exemples

Exemple #1 Boîte de téléchargement

Pour que les utilisateurs reçoivent une alerte pour sauver les fichiers générés, comme si l'on génère un fichier PDF, il est possible d'utiliser l'en-tête » Content-Disposition pour fournir un nom de fichier par défaut, à afficher dans le dialogue de sauvegarde.

    <?php
    // Vous voulez afficher un pdf
    header('Content-Type: application/pdf');

    // Il sera nommé downloaded.pdf
    header('Content-Disposition: attachment; filename="downloaded.pdf"');

    // Le source du PDF original.pdf
    readfile('original.pdf');
    ?>

Exemple #2 Directives concernant la mise en cache

Les scripts PHP génèrent souvent du HTML dynamiquement, qui ne doit pas être mis en cache, ni par le client, ni par les proxy intermédiaires. On peut forcer la désactivation du cache de nombreux clients et proxy avec :

    <?php
    header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
    header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
    ?>

> Note:

> Il est possible de se rendre compte que les pages ne sont jamais mises en cache même lors de l'utilisation de tous les en-têtes ci-dessus. Il existe toute une collection de paramètres que les utilisateurs peuvent modifier sur leur navigateur pour modifier le comportement par défaut du cache. En envoyant les en-têtes ci-dessus, il est possible d'imposer ses propres valeurs.

> De plus, les paramètres session_cache_limiter() et `session.cache_limiter` peuvent être utilisés pour générer les en-têtes de caches corrects, lorsque les sessions sont utilisées.

Exemple #3 Paramétrer un cookie

setcookie() offre un moyen pratique de paramétrer des cookies. Pour définir un cookie avec des attributs non pris en charge par setcookie(), header() peut être utilisé.

Par exemple, le code suivant définit un cookie qui inclut un attribut `Partitioned`.

    <?php
    header('Set-Cookie: name=value; Secure; Path=/; SameSite=None; Partitioned;');
    ?>

### Notes

> Note: Les en-têtes ne seront accessibles et s'afficheront que lorsqu'un SAPI qui les supporte sera utilisé.

> Note:

> Il est possible d'utiliser le système de cache (output buffering) pour contourner ce problème. Tous les textes générés seront mis en buffer sur le serveur jusqu'à ce qu'on les envoie. L'on peut utiliser les fonctions ob_start() et ob_end_flush() dans les scripts, ou en modifiant la directive de configuration `output_buffering` dans le fichier php.ini ou les fichiers de configuration du serveur.

> Note:

> Le code statut HTTP doit toujours être le premier à être envoyé au client, au regard de l'actuel header() qui peut être le premier ou non. Le statut peut être écrasé en appelant header() avec un nouveau statut à n'importe quel moment à moins que les en-têtes HTTP n'aient déjà été envoyés.

> Note:

> La plupart des clients modernes acceptent des URI relatives comme argument de » Location:, mais certains clients plus anciens exigent une URI absolue y compris le protocole, l'hôte et le chemin absolu. Il est possible de généralement utiliser les variables globales $_SERVER['HTTP_HOST'], $_SERVER['PHP_SELF'] et dirname() pour construire soi-même une URI absolue :

>     <?php
>     /* Redirection vers une page différente du même dossier */
>     $host  = $_SERVER['HTTP_HOST'];
>     $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
>     $extra = 'mypage.php';
>     header("Location: http://$host$uri/$extra");
>     exit;
>     ?>

> Note:

> L'ID de session n'est pas passé avec l'en-tête Location même si session.use_trans_sid est activé. Il doit être passé manuellement en utilisant la constante `SID`.

### Voir aussi

- headers_sent() - Indique si les en-têtes HTTP ont déjà été envoyés
- setcookie() - Envoie un cookie
- http_response_code() - Récupère ou définit le code de réponse HTTP
- header_remove() - Supprime un en-tête HTTP
- headers_list() - Retourne la liste des en-têtes de réponse du script courant
- La section sur l'identification HTTP

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open