mod_headers.xml.fr revision 6b779ab5be3e1a57d8e98951dc8614a312fcefa9
<?xml version="1.0"?>
<!-- English Revision : 1231446 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<modulesynopsis metafile="mod_headers.xml.meta">
<name>mod_headers</name>
<description>Personnalisation des en-têtes de requêtes et de réponses
HTTP</description>
<status>Extension</status>
<identifier>headers_module</identifier>
<summary>
<p>Ce module fournit des directives permettant de contrôler et
modifier les en-têtes de requêtes et de réponses HTTP. Les en-têtes
peuvent être fusionnés, remplacés ou supprimés.</p>
</summary>
<section id="order"><title>Chronologie du traitement</title>
<p>Les directives fournies par <module>mod_headers</module> peuvent
s'insérer presque partout dans la configuration du serveur, et on
peut limiter leur portée en les plaçant dans des <a
<p>La chronologie du traitement est importante et est affectée par
l'ordre d'apparition des directives dans le fichier de configuration
et par leur placement dans les <a
href="/sections.html#mergin">sections de configuration</a>. Ainsi,
ces deux directives ont un effet différent si leur ordre est inversé
:</p>
<example>
RequestHeader append MirrorID "mirror 12"<br />
RequestHeader unset MirrorID
</example>
<p>Dans cet ordre, l'en-tête <code>MirrorID</code> n'est pas défini.
Si l'ordre des directives était inversé, l'en-tête
<code>MirrorID</code> serait défini à "mirror 12".</p>
</section>
<section id="early"><title>Traitement précoce et traitement
tardif</title>
<p><module>mod_headers</module> peut agir soir précocement, soit
tardivement au niveau de la requête. Le mode normal est le mode
tardif, lorsque les en-têtes de <em>requête</em> sont définis, immédiatement
avant l'exécution du générateur de contenu, et pour les en-têtes de
<em>réponse</em>, juste au moment où la réponse est envoyée sur le réseau.
Utilisez toujours le mode tardif sur un serveur en production.</p>
<p>Le mode précoce a été conçu à des fins d'aide aux tests et au
débogage pour les développeurs. Les directives définies en utilisant
le mot-clé <code>early</code> sont censées agir au tout début du
traitement de la requête. Cela signifie que l'on peut les utiliser
pour simuler différentes requêtes et définir des situations de test,
tout en gardant à l'esprit que les en-têtes peuvent être modifiés à
tout moment par d'autres modules avant que le réponse ne soit
générée.</p>
<p>Comme les directives précoces sont traitées avant que le
chemin de la requête ne soit parcouru, les en-têtes
précoces ne peuvent être définis que dans un contexte de serveur
principal ou de serveur virtuel. Les directives précoces ne peuvent
pas dépendre d'un chemin de requête, si bien qu'elles échoueront
dans des contextes tels que <code><Directory></code> ou
<code><Location></code>.</p>
</section>
<section id="examples"><title>Exemples</title>
<ol>
<li>
Copie tous les en-têtes de requête qui commencent par "TS" vers
les en-têtes de la réponse :
<example>
Header echo ^TS
</example>
</li>
<li>
Ajoute à la réponse un en-tête, <code>mon-en-tête</code>, qui
contient un horodatage permettant de déterminer le moment où la
requête a été reçue, et le temps qui s'est écoulé jusqu'à ce que
la requête ait commencé à être servie. Cet en-tête peut être
utilisé par le client pour estimer la charge du serveur ou
isoler les goulets d'étranglement entre le client et le
serveur.
<example>
Header set mon-en-tête "%D %t"
</example>
<p>le résultat est l'ajout à la réponse d'un en-tête du type :</p>
<example>
mon-en-tête: D=3775428 t=991424704447256
</example>
</li>
<li>
Dit Bonjour à Joe
<example>
Header set mon-en-tête "Bonjour Joe. Il a fallu %D microsecondes \<br />
à Apache pour servir cette requête."
</example>
<p>le résultat est l'ajout à la réponse d'un en-tête du type :</p>
<example>
mon-en-tête: Bonjour Joe. Il a fallu D=3775428 microsecondes à Apache
pour servir cette requête.
</example>
</li>
<li>
Ajoute l'en-tête <code>mon-en-tête</code> à la réponse si et
seulement si l'en-tête <code>mon-en-tête-requête</code> est
présent dans la requête. Ceci peut s'avérer utile pour générer
des en-têtes de réponse "à la tête du client". Notez que cet
exemple nécessite les services du module
<module>mod_setenvif</module>.
<example>
SetEnvIf mon-en-tête-requête mavaleur HAVE_MyRequestHeader<br />
Header set mon-en-tête "%D %t montexte" env=HAVE_MyRequestHeader
</example>
<p>Si l'en-tête <code>mon-en-tête-requête: mavaleur</code> est
présent dans la requête HTTP, la réponse contiendra un en-tête
du type :</p>
<example>
mon-en-tête: D=3775428 t=991424704447256 montexte
</example>
</li>
<li>
Permet à DAV de fonctionner avec Apache sur SSL (voir la <a
href="http://svn.haxx.se/users/archive-2006-03/0549.shtml">description
du problème</a>) en remplaçant <var>https:</var> par
<var>http:</var> dans l'en-tête <var>Destination</var> :
<example>
RequestHeader edit Destination ^https: http: early
</example>
</li>
<li>
Définit la valeur d'un même en-tête sous de multiples conditions
non exclusives, mais ne duplique pas une valeur déjà définie
dans l'en-tête qui en résulte. Si toutes les conditions
suivantes sont satisfaites pour une requête (en d'autres termes,
si les trois variables d'environnement <code>CGI</code>,
<code>NO_CACHE</code> et <code>NO_STORE</code> existent pour la
requête) :
<example>
Header merge Cache-Control no-cache env=CGI<br />
Header merge Cache-Control no-cache env=NO_CACHE<br />
Header merge Cache-Control no-store env=NO_STORE
</example>
<p>alors, la réponse contiendra l'en-tête suivant :</p>
<example>
Cache-Control: no-cache, no-store
</example>
<p>Si <code>append</code> avait été utilisé à la place de
<code>merge</code>, la réponse aurait contenu l'en-tête suivant
:</p>
<example>
Cache-Control: no-cache, no-cache, no-store
</example>
</li>
<li>
Définit un cookie de test si et seulement si le client n'envoie
pas de cookie
<example>
Header set Set-Cookie testcookie "expr=-z %{req:Cookie}"
</example>
</li>
</ol>
</section>
<directivesynopsis>
<name>RequestHeader</name>
<description>Configure les en-têtes d'une requête HTTP</description>
<syntax>RequestHeader add|append|edit|edit*|merge|set|unset <var>en-tête</var>
[<var>valeur</var>] [<var>remplacement</var>] [early|env=[!]<var>variable</var>]</syntax>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>FileInfo</override>
<usage>
<p>Cette directive permet de remplacer, fusionner, modifier ou
supprimer des en-têtes de requête HTTP. L'en-tête est modifié juste
avant que le gestionnaire de contenu ne s'exécute, ce qui permet la
modification des en-têtes entrants. L'action effectuée est
déterminée par le premier argument. Ce dernier accepte les valeurs
suivantes :</p>
<dl>
<dt><code>add</code></dt>
<dd>L'en-tête est ajouté au jeu d'en-têtes préexistant, même s'il
existe déjà. Ceci peut conduire à la présence de deux (ou plusieurs)
en-têtes possèdant le même nom et donc induire des conséquences
imprévues ; en général, il est préférable d'utiliser
<code>set</code>, <code>append</code> ou <code>merge</code>.</dd>
<dt><code>append</code></dt>
<dd>La valeur d'en-tête est ajoutée à tout en-tête existant de même
nom. Lorsqu'une nouvelle valeur est ainsi ajoutée, elle est séparée
de celles qui sont déjà présentes par une virgule. Il s'agit de la
méthode HTTP standard permettant d'affecter plusieurs valeurs à un
en-tête.</dd>
<dt><code>edit*</code></dt>
<dd>Si l'en-tête existe, sa valeur est modifiée en fonction d'une
<glossary ref="regex">expression rationnelle</glossary> de type
<glossary ref="regex">expression rationnelle</glossary>, et
l'argument <var>remplacement</var> une chaîne de caractères de
remplacement qui peut contenir des références arrières. Avec
<code>edit</code>, la chaîne de l'en-tête correspondant au modèle ne
sera recherchée et remplacée qu'une seule fois, alors qu'avec
<code>edit*</code>, elle le sera pour chacune de ses instances si
elle apparaît plusieurs fois.</dd>
<dt><code>merge</code></dt>
<dd>La valeur d'en-tête est ajoutée à tout en-tête de même nom, sauf
si elle apparaît déjà dans la liste des valeurs préexistantes de
l'en-tête séparées par des virgules. Lorsqu'une nouvelle valeur est
ainsi ajoutée, elle est séparée de celles qui sont déjà présentes
par une virgule. Il s'agit de la méthode HTTP standard permettant
d'affecter plusieurs valeurs à un en-tête. Les valeurs sont
comparées en tenant compte de la casse, et après le traitement de
tous les spécificateurs de format. Une valeur entourée de guillemets
est considérée comme différente de la même valeur mais sans
guillemets.</dd>
<dt><code>set</code></dt>
<dd>L'en-tête est défini, remplaçant tout en-tête préexistant avec
le même nom.</dd>
<dt><code>unset</code></dt>
<dd>L'en-tête est supprimé s'il existe. Si plusieurs en-têtes
possèdent le même nom, ils seront tous supprimés. L'argument
<var>value</var> ne doit pas apparaître.</dd>
</dl>
<p>Cet argument est suivi d'un nom d'en-tête qui peut se terminer
par un caractère ':', mais ce n'est pas obligatoire. La casse est
ignorée. Avec <code>set</code>, <code>append</code>,
<code>merge</code> et <code>add</code>, une <var>valeur</var> est
fournie en troisième argument. Si une <var>valeur</var> contient des
espaces, elle doit être entourée de guillemets. Avec
<code>unset</code>, aucune <var>valeur</var> ne doit apparaître.
<var>valeur</var> peut être une chaîne de caractères, une chaîne
contenant des spécificateurs de format, ou une combinaison des deux.
Les spécificateurs de format supportés sont les mêmes que ceux de la
directive <directive module="mod_headers">Header</directive>, à
laquelle vous pouvez vous reporter pour plus de détails. Avec
<code>edit</code>, les deux arguments <var>valeur</var> et
<var>remplacement</var> sont obligatoires, et correspondent
respectivement à une <glossary ref="regex">expression
rationnelle</glossary> et à une chaîne de remplacement.</p>
<p>La directive <directive>RequestHeader</directive> peut être
suivie d'un argument supplémentaire, qui pourra prendre les valeurs
suivantes :</p>
<dl>
<dt><code>early</code></dt>
<dd>Spécifie <a href="#early">traitement préalable</a>.</dd>
<dt><code>env=[!]<var>variable</var></code></dt>
<dd>La directive est appliquée si et seulement si la <a
href="/env.html">variable d'environnement</a>
<code>variable</code> existe. Un <code>!</code> devant
<code>variable</code> inverse le test, et la directive ne
s'appliquera alors que si <code>variable</code> n'est pas définie.</dd>
<dt><code>expr=<var>expression</var></code></dt>
<dd>La directive s'applique si et seulement si <var>expression</var>
est évaluée à true. Vous trouverez plus de détails à propos de la
syntaxe et de l'évaluation des expressions dans la documentation <a
</dl>
<p>Excepté le cas du mode <a href="#early">précoce</a>, la directive
<directive>RequestHeader</directive> est traitée juste avant la
prise en compte de la requête par son gestionnaire, au cours de la
phase de vérification. Ceci permet la modification des en-têtes
générés par le navigateur, ou par les filtres en entrée
d'Apache.</p>
</usage>
</directivesynopsis>
<directivesynopsis>
<name>Header</name>
<description>Configure les en-têtes d'une réponse HTTP</description>
<syntax>Header [<var>condition</var>] add|append|echo|edit|merge|set|unset
<var>en-tête</var> [<var>valeur</var>] [early|env=[!]<var>variable</var>]</syntax>
<contextlist><context>server config</context><context>virtual host</context>
<context>directory</context><context>.htaccess</context></contextlist>
<override>FileInfo</override>
<compatibility>La condition par défaut est temporairement passée
à "always" dans les version 2.3.9 et 2.3.10</compatibility>
<usage>
<p>Cette directive permet de remplacer, fusionner, ou
supprimer des en-têtes de réponse HTTP. L'en-tête est modifié juste
après que le gestionnaire de contenu et les filtres en sortie ne
s'exécutent, ce qui permet la modification des en-têtes
sortants.</p>
<p>L'argument optionnel <var>condition</var> permet de déterminer
sur quelle table interne d'en-têtes de réponses cette directive va
opérer. D'autres composants du serveur peuvent avoir stocké leurs
en-têtes de réponses dans la table correspondant à
<code>onsuccess</code> ou dans celle correspondant à
<code>always</code>. Dans ce contexte, "Always" fait référence au
choix d'envoyer les en-têtes que vous ajoutez aux réponses, qu'elle
soient avec succès ou échouées ; par contre, si votre action est une
fonction d'un en-tête existant, vous devrez lire la documentation de
manière plus approfondie car dans ce cas, les choses se compliquent.</p>
<p>Vous pouvez avoir à changer la valeur par défaut
<code>onsuccess</code> en <code>always</code> dans des circonstances
similaires à celles exposées plus loin. Notez aussi que la répétition
de cette directive avec les deux conditions peut être pertinente
dans certains scénarios, car <code>always</code> n'englobe pas
<code>onsuccess</code> en ce qui concerne les en-têtes existants :</p>
<ul>
<li>Vous ajoutez un en-tête à une réponse échouée (non-2xx),
une redirection par exemple, et dans ce cas, seule la table
correspondant à <code>always</code> est utilisée dans la réponse
définitive.</li>
<li>Vous modifiez ou supprimez un en-tête généré par un script
CGI, et dans ce cas, les scripts CGI sont dans la table
correspondant à <code>always</code> et non dans la table par
défaut.</li>
<li>Vous modifiez ou supprimez un en-tête généré par tel ou tel
composant du serveur, mais cet en-tête n'est pas trouvé par la
condition par défaut <code>onsuccess</code>.</li>
</ul>
<p>L'action que cette directive provoque est déterminée par le
premier argument (ou par le second argument si une
<var>condition</var> est spécifiée). Il peut prendre
une des valeurs suivantes :</p>
<dl>
<dt><code>add</code></dt>
<dd>L'en-tête est ajouté au jeu d'en-têtes préexistant, même s'il
existe déjà. Ceci peut conduire à la présence de deux (ou plusieurs)
en-têtes possèdant le même nom et donc induire des conséquences
imprévues ; en général, il est préférable d'utiliser
<code>set</code>, <code>append</code> ou <code>merge</code>.</dd>
<dt><code>append</code></dt>
<dd>La valeur d'en-tête est ajoutée à tout en-tête existant de même
nom. Lorsqu'une nouvelle valeur est ainsi ajoutée, elle est séparée
de celles qui sont déjà présentes par une virgule. Il s'agit de la
méthode HTTP standard permettant d'affecter plusieurs valeurs à un
en-tête.</dd>
<dt><code>echo</code></dt>
<dd>Les en-têtes de la requête possédant le nom spécifié sont
recopiés vers les en-têtes de la réponse. <var>en-tête</var> peut
être une <glossary ref="regex">expression rationnelle</glossary>, et
<var>valeur</var> ne doit pas être présent.</dd>
<dt><code>edit</code></dt>
<dd>Si l'en-tête existe, sa valeur est modifiée en fonction d'une
<glossary ref="regex">expression rationnelle</glossary> de type
<glossary ref="regex">expression rationnelle</glossary>, et
l'argument <var>remplacement</var> une chaîne de caractères de
remplacement qui peut contenir des références arrières.</dd>
<dt><code>merge</code></dt>
<dd>La valeur d'en-tête est ajoutée à tout en-tête de même nom, sauf
si elle apparaît déjà dans la liste des valeurs préexistantes de
l'en-tête séparées par des virgules. Lorsqu'une nouvelle valeur est
ainsi ajoutée, elle est séparée de celles qui sont déjà présentes
par une virgule. Il s'agit de la méthode HTTP standard permettant
d'affecter plusieurs valeurs à un en-tête. Les valeurs sont
comparées en tenant compte de la casse, et après le traitement de
tous les spécificateurs de format. Une valeur entourée de guillemets
est considérée comme différente de la même valeur mais sans
guillemets.</dd>
<dt><code>set</code></dt>
<dd>L'en-tête est défini, remplaçant tout en-tête préexistant avec
le même nom. L'argument <var>valeur</var> peut être une chaîne de
formatage.</dd>
<dt><code>unset</code></dt>
<dd>L'en-tête est supprimé s'il existe. Si plusieurs en-têtes
possèdent le même nom, ils seront tous supprimés. L'argument
<var>value</var> ne doit pas apparaître.</dd>
</dl>
<p>Cet argument est suivi d'un nom d'<var>en-tête</var> qui peut se
terminer par un caractère ':', mais ce n'est pas obligatoire. La
casse est ignorée avec <code>set</code>, <code>append</code>,
<code>merge</code>, <code>add</code>, <code>unset</code> et
<code>edit</code>. Le nom d'<var>en-tête</var> est sensible à la
casse pour <code>echo</code> et peut être une <glossary
ref="regex">expression rationnelle</glossary>.</p>
<p>Avec <code>set</code>, <code>append</code>, <code>merge</code> et
<code>add</code>, une <var>valeur</var> est spécifiée comme
argument suivant. Si <var>valeur</var> contient des espaces, elle
doit être entourée de guillemets. <var>valeur</var> peut être une
chaîne de caractères, une chaîne contenant des spécificateurs de
format, ou une combinaison des deux. <var>valeur</var> supporte les
spécificateurs de format suivants :</p>
<table border="1" style="zebra">
<columnspec><column width=".25"/><column width=".75"/></columnspec>
<tr><th>Format</th><th>Description</th></tr>
<tr><td><code>%%</code></td>
<td>Le caractère pourcentage</td></tr>
<tr><td><code>%t</code></td>
<td>Le moment de réception de la requête en temps
universel coordonné depuis le temps epoch (Jan. 1, 1970) et
exprimé en microsecondes. La valeur est précédée de
<code>t=</code>.</td></tr>
<tr><td><code>%D</code></td>
<td>Le temps écoulé entre la réception de la requête et l'envoi
des en-têtes sur le réseau. Il s'agit de la durée de traitement
de la requête. La valeur est précédée de <code>D=</code>. La
valeur est exprimée en microsecondes.</td></tr>
<tr><td><code>%{NOM_VARIABLE}e</code></td>
d'environnement</a> <code>NOM_VARIABLE</code>.</td></tr>
<tr><td><code>%{NOM_VARIABLE}s</code></td>
d'environnement SSL</a> <code>NOM_VARIABLE</code>, si
<module>mod_ssl</module> est activé.</td></tr>
</table>
<note><title>Note</title>
<p>Le spécificateur de format <code>%s</code> est disponible
depuis la version 2.1 d'Apache ; il peut être utilisé à la place
de <code>%e</code> pour éviter de devoir spécifier
<code>SSLOptions +StdEnvVars</code>. Cependant, si
<code>SSLOptions +StdEnvVars</code> doit tout de même être
spécifié pour une raison quelconque, <code>%e</code> sera plus
efficace que <code>%s</code>.</p>
</note>
<p><code>edit</code>nécessite les deux arguments
<var>valeur</var>, qui est une <glossary ref="regex">expression
rationnelle</glossary>, et une chaîne additionnelle
<var>remplacement</var>.</p>
<p>La directive <directive>Header</directive> peut être suivie d'un
argument additionnel qui peut prendre les valeurs suivantes :</p>
<dl>
<dt><code>early</code></dt>
<dd>Spécifie <a href="#early">traitement préalable</a>.</dd>
<dt><code>env=[!]<var>variable</var></code></dt>
<dd>La directive est appliquée si et seulement si la <a
href="/env.html">variable d'environnement</a>
<code>variable</code> existe. Un <code>!</code> devant
<code>variable</code> inverse le test, et la directive ne
s'appliquera alors que si <code>variable</code> n'est pas définie.</dd>
<dt><code>expr=<var>expression</var></code></dt>
<dd>La directive s'applique si et seulement si <var>expression</var>
est évaluée à true. Vous trouverez plus de détails à propos de la
syntaxe et de l'évaluation des expressions dans la documentation <a
</dl>
<p>Excepté le cas du mode <a href="#early">précoce</a>, les
directives <directive>Header</directive> sont traitées juste avant
l'envoi de la réponse sur le réseau. Cela signifie qu'il est
l'exception de ceux qui sont ajoutés par le filtre HTTP
d'en-tête, comme Content-Type.</p>
</usage>
</directivesynopsis>
</modulesynopsis>