mirror of
https://github.com/php/doc-fr.git
synced 2026-03-24 15:12:13 +01:00
353 lines
11 KiB
XML
353 lines
11 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<!-- $Revision$ -->
|
|
<!-- EN-Revision: 5c1ccc6e24e5d470e75ef0a5887c2ff583266375 Maintainer: yannick Status: ready -->
|
|
<!-- Reviewed: no -->
|
|
|
|
<refentry xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://docbook.org/ns/docbook" xml:id="function.header">
|
|
<refnamediv>
|
|
<refname>header</refname>
|
|
<refpurpose>Envoie un en-tête HTTP brut</refpurpose>
|
|
</refnamediv>
|
|
|
|
<refsect1 role="description">
|
|
&reftitle.description;
|
|
<methodsynopsis>
|
|
<type>void</type><methodname>header</methodname>
|
|
<methodparam><type>string</type><parameter>header</parameter></methodparam>
|
|
<methodparam choice="opt"><type>bool</type><parameter>replace</parameter><initializer>&true;</initializer></methodparam>
|
|
<methodparam choice="opt"><type>int</type><parameter>response_code</parameter><initializer>0</initializer></methodparam>
|
|
</methodsynopsis>
|
|
<para>
|
|
<function>header</function> permet de spécifier l'en-tête <acronym>HTTP</acronym>
|
|
<parameter>string</parameter> lors de l'envoi des fichiers HTML.
|
|
Se reporter à <link xlink:href="&url.rfc;2616"><literal>HTTP/1.1
|
|
Specification</literal></link> pour plus d'informations sur les en-têtes
|
|
<acronym>HTTP</acronym>.
|
|
</para>
|
|
<para>
|
|
N'oubliez jamais que <function>header</function> 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
|
|
<function>include</function> ou
|
|
<function>require</function>,
|
|
et de laisser des espaces ou des lignes vides, qui produiront
|
|
un affichage avant que la fonction <function>header</function>
|
|
ne soit appelée. Le même problème existe avec les fichiers
|
|
PHP/HTML standards.
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<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;
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
</refsect1>
|
|
|
|
<refsect1 role="parameters">
|
|
&reftitle.parameters;
|
|
<para>
|
|
<variablelist>
|
|
<varlistentry>
|
|
<term><parameter>header</parameter></term>
|
|
<listitem>
|
|
<para>
|
|
L'en-tête.
|
|
</para>
|
|
<para>
|
|
Il y a deux en-têtes spéciaux. Le premier commence par la chaîne
|
|
"<literal>HTTP/</literal>" (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 <literal>ErrorDocument</literal>),
|
|
il faut s'assurer que le script génère un code statut correct.
|
|
</para>
|
|
<para>
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?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");
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
<para>
|
|
Le deuxième type d'appel spécial est <literal>"Location:"</literal>.
|
|
Non seulement il renvoie un en-tête au client, mais, en plus, il
|
|
envoie un statut <literal>REDIRECT</literal> (302) au navigateur
|
|
tant qu'un code statut <literal>201</literal> ou <literal>3xx</literal>
|
|
n'a pas été envoyé.
|
|
</para>
|
|
<para>
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?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;
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><parameter>replace</parameter></term>
|
|
<listitem>
|
|
<para>
|
|
Le paramètre optionnel <parameter>replace</parameter> indique
|
|
si la fonction <function>header</function> 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 :
|
|
</para>
|
|
<para>
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
header('WWW-Authenticate: Negotiate');
|
|
header('WWW-Authenticate: NTLM', false);
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
<varlistentry>
|
|
<term><parameter>response_code</parameter></term>
|
|
<listitem>
|
|
<para>
|
|
Force le code réponse HTTP à la valeur spécifiée. À noter que ce
|
|
paramètre a un effet uniquement si <parameter>header</parameter>
|
|
n'est pas vide.
|
|
</para>
|
|
</listitem>
|
|
</varlistentry>
|
|
</variablelist>
|
|
</para>
|
|
</refsect1>
|
|
|
|
<refsect1 role="returnvalues">
|
|
&reftitle.returnvalues;
|
|
<para>
|
|
&return.void;
|
|
</para>
|
|
</refsect1>
|
|
|
|
<refsect1 role="errors">
|
|
&reftitle.errors;
|
|
<para>
|
|
Lors de l'échec de la planification de l'envoi d'un en-tête,
|
|
<function>header</function> lève une erreur de niveau
|
|
<constant>E_WARNING</constant>.
|
|
</para>
|
|
</refsect1>
|
|
|
|
<refsect1 role="examples">
|
|
&reftitle.examples;
|
|
<para>
|
|
<example>
|
|
<title>Boîte de téléchargement</title>
|
|
<para>
|
|
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
|
|
<link xlink:href="&url.rfc;2183">Content-Disposition</link> pour
|
|
fournir un nom de fichier par défaut, à afficher dans le
|
|
dialogue de sauvegarde.
|
|
</para>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?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');
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>Directives concernant la mise en cache</title>
|
|
<para>
|
|
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 :
|
|
</para>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?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é
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
<para>
|
|
<note>
|
|
<para>
|
|
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.
|
|
</para>
|
|
<para>
|
|
De plus, les paramètres <function>session_cache_limiter</function> et
|
|
<literal>session.cache_limiter</literal> peuvent être utilisés pour
|
|
générer les en-têtes de caches corrects, lorsque les sessions sont
|
|
utilisées.
|
|
</para>
|
|
</note>
|
|
</para>
|
|
</example>
|
|
</para>
|
|
<para>
|
|
<example>
|
|
<title>Paramétrer un cookie</title>
|
|
<para>
|
|
<function>setcookie</function> offre un moyen pratique de paramétrer des cookies.
|
|
Pour définir un cookie avec des attributs non pris en charge par <function>setcookie</function>,
|
|
<function>header</function> peut être utilisé.
|
|
</para>
|
|
<para>
|
|
Par exemple, le code suivant définit un cookie qui inclut un attribut
|
|
<literal>Partitioned</literal>.
|
|
</para>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?php
|
|
header('Set-Cookie: name=value; Secure; Path=/; SameSite=None; Partitioned;');
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</example>
|
|
</para>
|
|
</refsect1>
|
|
|
|
<refsect1 role="notes">
|
|
&reftitle.notes;
|
|
¬e.network.header.sapi;
|
|
<note>
|
|
<para>
|
|
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 <function>ob_start</function> et
|
|
<function>ob_end_flush</function> dans les scripts, ou en
|
|
modifiant la directive de configuration <literal>output_buffering</literal>
|
|
dans le fichier &php.ini; ou les fichiers
|
|
de configuration du serveur.
|
|
</para>
|
|
</note>
|
|
<note>
|
|
<para>
|
|
Le code statut HTTP doit toujours être le premier à être envoyé au client,
|
|
au regard de l'actuel <function>header</function> qui peut être le premier
|
|
ou non. Le statut peut être écrasé en appelant <function>header</function>
|
|
avec un nouveau statut à n'importe quel moment à moins que les en-têtes HTTP
|
|
n'aient déjà été envoyés.
|
|
</para>
|
|
</note>
|
|
<note>
|
|
<para>
|
|
La plupart des clients modernes acceptent des <acronym>URI</acronym> relatives comme argument de
|
|
<link xlink:href="&spec.http1.1;#section-7.1.2">Location:</link>,
|
|
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 <varname>$_SERVER['HTTP_HOST']</varname>,
|
|
<varname>$_SERVER['PHP_SELF']</varname> et <function>dirname</function> pour
|
|
construire soi-même une URI absolue :
|
|
<informalexample>
|
|
<programlisting role="php">
|
|
<![CDATA[
|
|
<?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;
|
|
?>
|
|
]]>
|
|
</programlisting>
|
|
</informalexample>
|
|
</para>
|
|
</note>
|
|
<note>
|
|
<para>
|
|
L'ID de session n'est pas passé avec l'en-tête Location même si
|
|
<link linkend="ini.session.use-trans-sid">session.use_trans_sid</link>
|
|
est activé. Il doit être passé manuellement en utilisant la constante
|
|
<constant>SID</constant>.
|
|
</para>
|
|
</note>
|
|
</refsect1>
|
|
|
|
<refsect1 role="seealso">
|
|
&reftitle.seealso;
|
|
<para>
|
|
<simplelist>
|
|
<member><function>headers_sent</function></member>
|
|
<member><function>setcookie</function></member>
|
|
<member><function>http_response_code</function></member>
|
|
<member><function>header_remove</function></member>
|
|
<member><function>headers_list</function></member>
|
|
<member>
|
|
La section sur l'<link linkend="features.http-auth">identification
|
|
HTTP</link>
|
|
</member>
|
|
</simplelist>
|
|
</para>
|
|
</refsect1>
|
|
|
|
</refentry>
|
|
<!-- Keep this comment at the end of the file
|
|
Local variables:
|
|
mode: sgml
|
|
sgml-omittag:t
|
|
sgml-shorttag:t
|
|
sgml-minimize-attributes:nil
|
|
sgml-always-quote-attributes:t
|
|
sgml-indent-step:1
|
|
sgml-indent-data:t
|
|
indent-tabs-mode:nil
|
|
sgml-parent-document:nil
|
|
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
|
|
sgml-exposed-tags:nil
|
|
sgml-local-catalogs:nil
|
|
sgml-local-ecat-files:nil
|
|
End:
|
|
vim600: syn=xml fen fdm=syntax fdl=2 si
|
|
vim: et tw=78 syn=sgml
|
|
vi: ts=1 sw=1
|
|
-->
|