<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.network.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'fr',
  ),
  'this' => 
  array (
    0 => 'function.header.php',
    1 => 'header',
    2 => 'Envoie un en-t&ecirc;te HTTP brut',
  ),
  'up' => 
  array (
    0 => 'ref.network.php',
    1 => 'Fonctions r&eacute;seaux',
  ),
  'prev' => 
  array (
    0 => 'function.getservbyport.php',
    1 => 'getservbyport',
  ),
  'next' => 
  array (
    0 => 'function.header-register-callback.php',
    1 => 'header_register_callback',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'fr',
    'path' => 'reference/network/functions/header.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.header" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">header</h1>
  <p class="verinfo">(PHP 4, PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">header</span> &mdash; <span class="dc-title">Envoie un en-tête HTTP brut</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-function.header-description">
  <h3 class="title">Description</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>header</strong></span>(<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$header</code></span>, <span class="methodparam"><span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> <code class="parameter">$replace</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong></span></span>, <span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter">$response_code</code><span class="initializer"> = 0</span></span>): <span class="type"><a href="language.types.void.php" class="type void">void</a></span></div>

  <p class="para rdfs-comment">
   <span class="function"><strong>header()</strong></span> permet de spécifier l&#039;en-tête <abbr title="Hypertext Transfer Protocol">HTTP</abbr>
   <code class="parameter">string</code> lors de l&#039;envoi des fichiers HTML.
   Se reporter à <a href="https://datatracker.ietf.org/doc/html/rfc2616" class="link external">&raquo;&nbsp;<code class="literal">HTTP/1.1
     Specification</code></a> pour plus d&#039;informations sur les en-têtes
   <abbr title="Hypertext Transfer Protocol">HTTP</abbr>.
  </p>
  <p class="para">
   N&#039;oubliez jamais que <span class="function"><strong>header()</strong></span> 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
   <span class="function"><a href="function.include.php" class="function">include</a></span> ou
   <span class="function"><a href="function.require.php" class="function">require</a></span>,
   et de laisser des espaces ou des lignes vides, qui produiront
   un affichage avant que la fonction <span class="function"><strong>header()</strong></span>
   ne soit appelée. Le même problème existe avec les fichiers
   PHP/HTML standards.
   <div class="informalexample">
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000">&lt;html&gt;<br /><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/* Ceci produira une erreur. Notez la sortie ci-dessus,<br /> * qui se trouve avant l'appel à la fonction header() */<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'Location: http://www.example.com/'</span><span style="color: #007700">);<br />exit;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.header-parameters">
  <h3 class="title">Liste de paramètres</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">header</code></dt>
     <dd>
      <p class="para">
       L&#039;en-tête.
      </p>
      <p class="para">
       Il y a deux en-têtes spéciaux. Le premier commence par la chaîne
       &quot;<code class="literal">HTTP/</code>&quot; (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 <code class="literal">ErrorDocument</code>),
       il faut s&#039;assurer que le script génère un code statut correct.
      </p>
      <p class="para">
       <div class="informalexample">
        <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Cet exemple illustre le cas spécial "HTTP/"<br />// De meilleures alternatives dans les cas d'utilisation typiques incluent :<br />// 1. header($_SERVER["SERVER_PROTOCOL"] . " 404 Not Found");<br />//    (pour surcharger les messages de statut HTTP pour les clients qui utilisent encore HTTP/1.0)<br />// 2. http_response_code(404); (pour utiliser le message par défaut)<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">"HTTP/1.1 404 Not Found"</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
        </div>

       </div>
      </p>
      <p class="para">
       Le deuxième type d&#039;appel spécial est <code class="literal">&quot;Location:&quot;</code>.
       Non seulement il renvoie un en-tête au client, mais, en plus, il
       envoie un statut <code class="literal">REDIRECT</code> (302) au navigateur
       tant qu&#039;un code statut <code class="literal">201</code> ou <code class="literal">3xx</code>
       n&#039;a pas été envoyé.
      </p>
      <p class="para">
       <div class="informalexample">
        <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />header</span><span style="color: #007700">(</span><span style="color: #DD0000">"Location: http://www.example.com/"</span><span style="color: #007700">); </span><span style="color: #FF8000">/* Redirection du navigateur */<br /><br />/* Assurez-vous que la suite du code ne soit pas exécutée une fois la redirection effectuée. */<br /></span><span style="color: #007700">exit;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
        </div>

       </div>
      </p>
     </dd>
    
    
     <dt><code class="parameter">replace</code></dt>
     <dd>
      <p class="para">
       Le paramètre optionnel <code class="parameter">replace</code> indique
       si la fonction <span class="function"><strong>header()</strong></span> 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 <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> dans cet argument, l&#039;on peut
       forcer les en-têtes multiples pour un même type d&#039;en-tête.
       Par exemple :
      </p>
      <p class="para">
       <div class="informalexample">
        <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />header</span><span style="color: #007700">(</span><span style="color: #DD0000">'WWW-Authenticate: Negotiate'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'WWW-Authenticate: NTLM'</span><span style="color: #007700">, </span><span style="color: #0000BB">false</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
        </div>

       </div>
      </p>
     </dd>
    
    
     <dt><code class="parameter">response_code</code></dt>
     <dd>
      <p class="para">
       Force le code réponse HTTP à la valeur spécifiée. À noter que ce
       paramètre a un effet uniquement si <code class="parameter">header</code>
       n&#039;est pas vide.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.header-returnvalues">
  <h3 class="title">Valeurs de retour</h3>
  <p class="para">
   Aucune valeur n&#039;est retournée.
  </p>
 </div>


 <div class="refsect1 errors" id="refsect1-function.header-errors">
  <h3 class="title">Erreurs / Exceptions</h3>
  <p class="para">
   Lors de l&#039;échec de la planification de l&#039;envoi d&#039;un en-tête,
   <span class="function"><strong>header()</strong></span> lève une erreur de niveau
   <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong>.
  </p>
 </div>


 <div class="refsect1 examples" id="refsect1-function.header-examples">
  <h3 class="title">Exemples</h3>
  <p class="para">
   <div class="example" id="example-1">
    <p><strong>Exemple #1 Boîte de téléchargement</strong></p>
    <div class="example-contents"><p>
     Pour que les utilisateurs reçoivent une alerte pour sauver
     les fichiers générés, comme si l&#039;on génère un
     fichier PDF, il est possible d&#039;utiliser l&#039;en-tête
     <a href="https://datatracker.ietf.org/doc/html/rfc2183" class="link external">&raquo;&nbsp;Content-Disposition</a> pour
     fournir un nom de fichier par défaut, à afficher dans le
     dialogue de sauvegarde.
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Vous voulez afficher un pdf<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'Content-Type: application/pdf'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Il sera nommé downloaded.pdf<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">'Content-Disposition: attachment; filename="downloaded.pdf"'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// Le source du PDF original.pdf<br /></span><span style="color: #0000BB">readfile</span><span style="color: #007700">(</span><span style="color: #DD0000">'original.pdf'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
  <p class="para">
   <div class="example" id="example-2">
    <p><strong>Exemple #2 Directives concernant la mise en cache</strong></p>
    <div class="example-contents"><p>
     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 :
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />header</span><span style="color: #007700">(</span><span style="color: #DD0000">"Cache-Control: no-cache, must-revalidate"</span><span style="color: #007700">); </span><span style="color: #FF8000">// HTTP/1.1<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">"Expires: Sat, 26 Jul 1997 05:00:00 GMT"</span><span style="color: #007700">); </span><span style="color: #FF8000">// Date dans le passé<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>
     <blockquote class="note"><p><strong class="note">Note</strong>: 
      <p class="para">
       Il est possible de se rendre compte que les pages ne sont jamais mises
       en cache même lors de l&#039;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&#039;imposer ses propres valeurs.
      </p>
      <p class="para">
       De plus, les paramètres <span class="function"><a href="function.session-cache-limiter.php" class="function">session_cache_limiter()</a></span> et
       <code class="literal">session.cache_limiter</code> peuvent être utilisés pour
       générer les en-têtes de caches corrects, lorsque les sessions sont
       utilisées.
      </p>
     </p></blockquote>
    </p></div>
   </div>
  </p>
  <p class="para">
   <div class="example" id="example-3">
    <p><strong>Exemple #3 Paramétrer un cookie</strong></p>
    <div class="example-contents"><p>
     <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span> offre un moyen pratique de paramétrer des cookies.
     Pour définir un cookie avec des attributs non pris en charge par <span class="function"><a href="function.setcookie.php" class="function">setcookie()</a></span>,
     <span class="function"><strong>header()</strong></span> peut être utilisé.
    </p></div>
    <div class="example-contents"><p>
     Par exemple, le code suivant définit un cookie qui inclut un attribut
     <code class="literal">Partitioned</code>.
    </p></div>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />header</span><span style="color: #007700">(</span><span style="color: #DD0000">'Set-Cookie: name=value; Secure; Path=/; SameSite=None; Partitioned;'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </p>
 </div>


 <div class="refsect1 notes" id="refsect1-function.header-notes">
  <h3 class="title">Notes</h3>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
 <p class="para">
  Les en-têtes ne seront accessibles et s&#039;afficheront que lorsqu&#039;un SAPI qui les supporte sera utilisé.
 </p>
</p></blockquote>

  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Il est possible d&#039;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&#039;à ce qu&#039;on les envoie. L&#039;on peut
    utiliser les fonctions <span class="function"><a href="function.ob-start.php" class="function">ob_start()</a></span> et
    <span class="function"><a href="function.ob-end-flush.php" class="function">ob_end_flush()</a></span> dans les scripts, ou en
    modifiant la directive de configuration <code class="literal">output_buffering</code>
    dans le fichier <var class="filename">php.ini</var> ou les fichiers
    de configuration du serveur.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    Le code statut HTTP doit toujours être le premier à être envoyé au client,
    au regard de l&#039;actuel <span class="function"><strong>header()</strong></span> qui peut être le premier
    ou non. Le statut peut être écrasé en appelant <span class="function"><strong>header()</strong></span>
    avec un nouveau statut à n&#039;importe quel moment à moins que les en-têtes HTTP
    n&#039;aient déjà été envoyés.
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    La plupart des clients modernes acceptent des <abbr title="Uniform Resource Identifier">URI</abbr> relatives comme argument de
    <a href="http://tools.ietf.org/html/rfc7231#section-7.1.2" class="link external">&raquo;&nbsp;Location:</a>,
    mais certains clients plus anciens exigent une URI absolue
    y compris le protocole, l&#039;hôte et le chemin absolu. Il est possible de généralement
    utiliser les variables globales <var class="varname"><a href="reserved.variables.server.php" class="classname">$_SERVER['HTTP_HOST']</a></var>,
    <var class="varname"><a href="reserved.variables.server.php" class="classname">$_SERVER['PHP_SELF']</a></var> et <span class="function"><a href="function.dirname.php" class="function">dirname()</a></span> pour
    construire soi-même une URI absolue :
    <div class="informalexample">
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">/* Redirection vers une page différente du même dossier */<br /></span><span style="color: #0000BB">$host  </span><span style="color: #007700">= </span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'HTTP_HOST'</span><span style="color: #007700">];<br /></span><span style="color: #0000BB">$uri   </span><span style="color: #007700">= </span><span style="color: #0000BB">rtrim</span><span style="color: #007700">(</span><span style="color: #0000BB">dirname</span><span style="color: #007700">(</span><span style="color: #0000BB">$_SERVER</span><span style="color: #007700">[</span><span style="color: #DD0000">'PHP_SELF'</span><span style="color: #007700">]), </span><span style="color: #DD0000">'/\\'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$extra </span><span style="color: #007700">= </span><span style="color: #DD0000">'mypage.php'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">header</span><span style="color: #007700">(</span><span style="color: #DD0000">"Location: http://</span><span style="color: #0000BB">$host$uri</span><span style="color: #DD0000">/</span><span style="color: #0000BB">$extra</span><span style="color: #DD0000">"</span><span style="color: #007700">);<br />exit;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Note</strong>: 
   <p class="para">
    L&#039;ID de session n&#039;est pas passé avec l&#039;en-tête Location même si
    <a href="session.configuration.php#ini.session.use-trans-sid" class="link">session.use_trans_sid</a>
    est activé. Il doit être passé manuellement en utilisant la constante
    <strong><code><a href="session.constants.php#constant.sid">SID</a></code></strong>.
   </p>
  </p></blockquote>
 </div>


 <div class="refsect1 seealso" id="refsect1-function.header-seealso">
  <h3 class="title">Voir aussi</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="function"><a href="function.headers-sent.php" class="function" rel="rdfs-seeAlso">headers_sent()</a> - Indique si les en-t&ecirc;tes HTTP ont d&eacute;j&agrave; &eacute;t&eacute; envoy&eacute;s</span></li>
    <li><span class="function"><a href="function.setcookie.php" class="function" rel="rdfs-seeAlso">setcookie()</a> - Envoie un cookie</span></li>
    <li><span class="function"><a href="function.http-response-code.php" class="function" rel="rdfs-seeAlso">http_response_code()</a> - R&eacute;cup&egrave;re ou d&eacute;finit le code de r&eacute;ponse HTTP</span></li>
    <li><span class="function"><a href="function.header-remove.php" class="function" rel="rdfs-seeAlso">header_remove()</a> - Supprime un en-t&ecirc;te HTTP</span></li>
    <li><span class="function"><a href="function.headers-list.php" class="function" rel="rdfs-seeAlso">headers_list()</a> - Retourne la liste des en-t&ecirc;tes de r&eacute;ponse du script courant</span></li>
    <li>
     La section sur l'<a href="features.http-auth.php" class="link">identification
      HTTP</a>
    </li>
   </ul>
  </p>
 </div>


</div><?php manual_footer($setup); ?>