1 <?xml version="1.0" encoding="ISO-8859-1" ?>
2 <!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
4 <!-- English Revision: 1673947 -->
5 <!-- French translation : Lucien GENTIS -->
6 <!-- Reviewed by : Vincent Deffontaines -->
9 Licensed to the Apache Software Foundation (ASF) under one or more
10 contributor license agreements. See the NOTICE file distributed with
11 this work for additional information regarding copyright ownership.
12 The ASF licenses this file to You under the Apache License, Version 2.0
13 (the "License"); you may not use this file except in compliance with
14 the License. You may obtain a copy of the License at
16 http://www.apache.org/licenses/LICENSE-2.0
18 Unless required by applicable law or agreed to in writing, software
19 distributed under the License is distributed on an "AS IS" BASIS,
20 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21 See the License for the specific language governing permissions and
22 limitations under the License.
25 <manualpage metafile="compliance.xml.meta">
27 <title>Conformité au protocole HTTP</title>
30 <p>Ce document décrit le mécanisme utilisé pour définir une
31 politique de conformité au protocole HTTP pour un espace d'URL au
32 niveau des serveurs d'origine ou des application sous-jacentes à cet
35 <p>Chaque politique de conformité est décrite ci-dessous à
36 destination de tous ceux qui ont reçu un message d'erreur suite à un
37 rejet en provenance d'une politique, et ont donc besoin de savoir à
38 quoi est du ce rejet et ce qu'ils doivent faire pour corriger
41 <seealso><a href="filter.html">Filtres</a></seealso>
44 <title>Imposer la conformité au protocole HTTP dans Apache 2</title>
47 <module>mod_policy</module>
50 <directive module="mod_policy">PolicyConditional</directive>
51 <directive module="mod_policy">PolicyLength</directive>
52 <directive module="mod_policy">PolicyKeepalive</directive>
53 <directive module="mod_policy">PolicyType</directive>
54 <directive module="mod_policy">PolicyVary</directive>
55 <directive module="mod_policy">PolicyValidation</directive>
56 <directive module="mod_policy">PolicyNocache</directive>
57 <directive module="mod_policy">PolicyMaxage</directive>
58 <directive module="mod_policy">PolicyVersion</directive>
62 <p>Le protocole HTTP applique le <strong>principe de
63 robustesse</strong> décrit dans la <a
64 href="http://tools.ietf.org/html/rfc1122">RFC1122</a>, et stipulant
65 <strong>"Soyez libéral pour ce que vous acceptez, conservateur pour
66 ce que vous envoyez"</strong>. Selon ce principe, les clients HTTP
67 vont compenser en corrigeant les réponses incorrectes ou mal
68 configurées, ou ne pouvant pas être mises en cache.</p>
70 <p>Comme un site web est configuré pour faire face à un trafic
71 toujours grandissant, des applications mal configurées ou non
72 optimisées ou certaines configurations de serveur peuvent menacer la stabilité
73 et l'évolutivité du site web, ainsi que les coûts d'hébergement qui
74 y sont associés. L'évolution d'un site web pour faire face à une
75 complexité croissante de sa configuration accroît les
76 difficultés rencontrées pour détecter et enregistrer les espaces
77 d'URL mal configurés pour un serveur donné.</p>
79 <p>De ce fait, un point peut être atteint où le principe
80 "conservateur pour ce que vous envoyez" doit être imposé par
81 l'administrateur du serveur.</p>
83 <p>Le module <module>mod_policy</module> fournit un jeu de filtres
84 qui peuvent être appliqués à un serveur, permettant de tester
85 explicitement les points clé du protocle HTTP, et de journaliser en
86 tant qu'avertissements les réponses non conformes, ou même de
87 simplement les rejeter avec un code d'erreur. Chaque filtre peut
88 être appliqué séparément, permettant à l'administrateur de choisir
89 quelles politiques de conformité doivent être imposées en fonction
93 <p>Les filtres peuvent être mis en place dans des environnements de
94 test ou de simulation à destination des développeurs d'applications
95 et de sites web, ou s'appliquer à des serveurs en production pour
96 protéger l'infrastructure de systèmes en dehors du contrôle direct
97 de l'administrateur.</p>
100 <img src="images/compliance-reverse-proxy.png" width="666" height="239" alt=
101 "Imposer la conformité au protocole HTTP pour un serveur
105 <p>Dans l'exemple ci-dessus, un serveur Apache httpd a été intercalé
106 entre le serveur d'applications et l'internet au sens large, et
107 configuré pour mettre en cache les réponses en provenance du serveur
108 d'applications. Les filtres de <module>mod_policy</module> ont été
109 ajoutés pour imposer le support de la mise en cache de contenu et
110 des requêtes conditionnelles, assurant ainsi que
111 <module>mod_cache</module> et les caches publics de l'internet
112 seront pleinement capables de mettre en cache le contenu créé avec
113 efficacité par le serveur d'applications.</p>
116 <img src="images/compliance-static.png" width="469" height="239" alt=
117 "Imposer la conformité au protocole HTTP pour un serveur statique"/>
120 <p>Dans l'exemple plus simple ci-dessus, un serveur statique qui
121 sert du contenu ayant une forte probabilité d'être mis en cache,
122 se voit appliqué un jeu de règles afin de
123 s'assurer que sa configuration respecte un niveau minimum de
124 conformité au protocole HTTP.</p>
128 <section id="policyconditional">
129 <title>Politique des requêtes conditionnelles</title>
132 <module>mod_policy</module>
135 <directive module="mod_policy">PolicyConditional</directive>
139 <p>Cette politique sera rejetée si le serveur ne répond pas à une
140 requête conditionnelle avec le code d'état approprié. </p>
142 <p>C'est grâce aux requêtes conditionnelles qu'un cache HTTP peut
143 rafraîchir un contenu périmé, et en particulier dans le cas des
144 contenus à durée de validité courte, l'absence de support des
145 requêtes conditionnelles peut augmenter la charge du serveur.</p>
147 <p>Plus particulièrement, la présence d'une des en-têtes suivantes
148 dans la requête rend cette dernière conditionnelle :</p>
151 <dt><code>If-Match</code></dt>
152 <dd>Si l'ETag fourni dans l'en-tête <code>If-Match</code> ne
153 correspond pas à l'ETag de la réponse, le serveur doit renvoyer un
154 code d'erreur <code>412 Precondition Failed</code>. Vous trouverez
155 tous les détails du traitement d'un en-tête <code>If-Match</code>
157 href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.24">RFC2616
158 section 14.24</a>.</dd>
160 <dt><code>If-None-Match</code></dt>
161 <dd>Si l'ETag fourni dans l'en-tête <code>If-None-Match</code>
162 correspond à l'ETag de la réponse, le serveur doit renvoyer soit
163 <code>304 Not Modified</code> pour les requêtes GET/HEAD, soit
164 <code>412 Precondition Failed</code> pour les autres méthodes. Vous trouverez
165 tous les détails du traitement d'un en-tête
166 <code>If-None-Match</code> dans la <a
167 href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26">RFC2616
168 section 14.26</a>.</dd>
170 <dt><code>If-Modified-Since</code></dt>
171 <dd>Si la date fournie dans l'en-tête <code>If-Modified-Since</code>
172 est plus ancienne que celle de l'en-tête <code>Last-Modified</code>
173 de la réponse, le serveur doit renvoyer <code>304 Not Modified</code>. Vous trouverez
174 tous les détails du traitement d'un en-tête
175 <code>If-Modified-Since</code> dans la <a
176 href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.25">RFC2616
177 section 14.25</a>.</dd>
179 <dt><code>If-Unmodified-Since</code></dt>
180 <dd>Si la date fournie dans l'en-tête
181 <code>If-Unmodified-Since</code> est plus récente que celle de
182 l'en-tête <code>Last-Modified</code> de la réponse, le serveur doit
183 renvoyer <code>412 Precondition Failed</code>. Vous trouverez
184 tous les détails du traitement d'un en-tête
185 <code>If-Unmodified-Since</code> dans la <a
186 href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.28">RFC2616
187 section 14.28</a>.</dd>
189 <dt><code>If-Range</code></dt>
190 <dd>Si l'ETag fourni dans l'en-tête <code>If-Range</code> correspond
191 à l'ETag ou à l'en-tête Last-Modified de la réponse, et si un
192 en-tête <code>Range</code> valide est présent, le serveur doit
193 renvoyer <code>206 Partial Response</code>. Vous trouverez
194 tous les détails du traitement d'un en-tête <code>If-Range</code>
196 href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.27">RFC2616
197 section 14.27</a>.</dd>
201 <p>Si la réponse est considérée comme ayant réussi (une réponse
202 2xx), alors qu'elle était conditionnelle et qu'une des réponses
203 ci-dessus était attendue à la place, cette politique sera rejetée.
204 Les réponses qui indiquent une redirection ou une erreur de toute
205 sorte (3xx, 4xx, 5xx) seront ignorées de cette politique.</p>
207 <p>Cette politique est implémentée par le filtre
208 <strong>POLICY_CONDITIONAL</strong>.</p>
212 <section id="policylength">
213 <title>Politique de gestion de l'en-tête Content-Length</title>
216 <module>mod_policy</module>
219 <directive module="mod_policy">PolicyLength</directive>
223 <p>Cette politique sera rejetée si la réponse du serveur ne contient pas d'en-tête
224 <code>Content-Length</code> explicite.</p>
226 <p>De nombreuses méthodes pour déterminer la taille d'un
227 corps de réponse sont décrites dans la <a
228 href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4">RFC2616
229 section 4.4 Message Length</a>.</p>
231 <p>Lorsque l'en-tête <code>Content-Length</code> est présente, la
232 taille du corps est déclarée au début de la réponse. Si cette
233 information est manquante, un cache HTTP pourrait choisir d'ignorer
234 la réponse, car il ne pourrait pas déterminer a priori si la réponse
235 reste dans les limites définies du cache.</p>
237 <p>Pour indiquer la fin de la réponse au client sans que ce dernier
238 ait à en connaître la taille au préalable, HTTP/1.1 propose
239 l'en-tête <code>Transfer-Encoding</code> comme une alternative à
240 <code>Content-Length</code>. Cependant, lors du traitement de
241 requêtes HTTP/1.0, et si l'en-tête <code>Content-Length</code> est
242 absente, le seul mécanisme dont dispose le serveur pour indiquer la
243 fin de la requête consiste à couper la connexion. Dans un
244 environnement contenant des répartiteurs de charge, cela peut
245 court-circuiter le mécanisme des connexions persistantes
249 <p>Si la réponse est considérée comme réussie (une réponse 2xx) et
250 possède un corps (ce qui exclut les réponses <code>204 No
251 Content</code>), et si l'en-tête <code>Content-Length</code> est
252 absente, la réponse sera rejetée. Aucune réponse indiquant une
253 redirection ou une erreur de toute nature (3xx, 4xx, 5xx) n'est
254 prise en compte par cette politique.</p>
256 <note type="warning">Notez que certains modules comme
257 <module>mod_proxy</module> ajoutent leur propre en-tête
258 <code>Content-Length</code> sous réserve que la réponse où cette
259 en-tête est absente soit suffisamment courte pour que le module ait
260 pu la lire en une seule passe. De ce fait, des réponses courtes pourront
261 être acceptées par la politique, alors que d'autres plus longues
262 seront rejetées pour la même URL.</note>
264 <p>Cette politique est implémentée par le filtre
265 <strong>POLICY_LENGTH</strong>.</p>
269 <section id="policytype">
270 <title>Politique de filtrage de l'en-tête Content-Type</title>
273 <module>mod_policy</module>
276 <directive module="mod_policy">PolicyType</directive>
280 <p>Cette politique sera rejetée si la réponse du serveur ne contient pas d'en-tête
281 <code>Content-Type</code> explicite et valide du point de vue de la
282 syntaxe, correspondant au modèle défini par le serveur.</p>
284 <p>Le type de media du corps est placé dans une en-tête
285 <code>Content-Type</code> dont le format est décrit en détail dans
286 la <a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7">
287 RFC2616 section 3.7 Media Types</a>.</p>
289 <p>Une en-tête <code>Content-Type</code> dont la syntaxe est valide
293 Content-Type: text/html; charset=iso-8859-1
296 <p>Exemples d'en-têtes <code>Content-Type</code> non valides :</p>
300 Content-Type: foo<br />
305 <p>L'administrateur peut restreindre la politique à un ou plusieurs
306 types spécifiques, ou utiliser des caractères génériques comme
307 <code>*/*</code>.</p>
309 <p>Cette politique est mise en oeuvre par le filtre
310 <strong>POLICY_TYPE</strong>.</p>
314 <section id="policykeepalive">
315 <title>Politique de gestion des connexions persistantes (Keepalive)</title>
318 <module>mod_policy</module>
321 <directive module="mod_policy">PolicyKeepalive</directive>
325 <p>Cette politique era rejetée si la réponse du serveur ne contient pas d'en-tête
326 <code>Content-Length</code> explicite, ou d'en-tête
327 <code>Transfer-Encoding</code> défini à chunked.</p>
329 <p>De nombreuses manières pour déterminer la taille d'un
330 corps de réponse sont décrites dans la <a
331 href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.4">RFC2616
332 section 4.4 Message Length</a>.</p>
334 <p>Pour indiquer la fin de la réponse au client sans que ce dernier
335 ait à en connaître la taille au préalable, HTTP/1.1 propose
336 l'en-tête <code>Transfer-Encoding</code> comme une alternative à
337 <code>Content-Length</code>. Cependant, lors du traitement de
338 requêtes HTTP/1.0, et si l'en-tête <code>Content-Length</code> est
339 absent, le seul mécanisme dont dispose le serveur pour indiquer la
340 fin de la requête consiste à couper la connexion. Dans un
341 environnement contenant des répartiteurs de charge, cela peut
342 court-circuiter le mécanisme des connexions persistantes
346 <p>En particulier, les règles suivantes sont appliquées : </p>
350 <dd>cette connexion n'est pas marquée en erreur ;</dd>
353 <dd>le client n'attend pas 100-continue ;</dd>
356 <dd>le code de statut de la réponse ne nécessite pas de fermeture de connexion ;</dd>
359 <dd>le corps de la réponse a une taille définie suite au code de
360 statut 304 ou 204, la méthode de requête est HEAD, un en-tête
361 Content-Length ou Transfer-Encoding: chunked a déjà été défini, ou
362 la requête est de type HTTP/1.1 et peut donc être définie à chunked.</dd>
365 <dd>keepalive est supporté.</dd>
368 <note type="warning">Le serveur peut décider de désactiver les
369 connexions persistantes pour de nombreuses raisons, comme un arrêt
370 imminent, un Connection: close en provenance du client, ou une
371 requête client de type HTTP/1.0 dont la réponse ne comporte pas
372 d'en-tête <code>Content-Length</code>, mais pour ce qui nous
373 concerne, nous ne vérifions que la possibilité des connexions
374 persistantes depuis l'application, et non si les connexions
375 persistantes sont activées.</note>
377 <p>Notez aussi que le serveur HTTP Apache propose un filtre qui
378 ajoute un codage chunked aux réponses qui ne contiennent pas
379 d'en-tête <code>Content-Length</code> explicite. Cette politique
380 prend en compte les cas où le filtre est court-circuité ou
381 désactivé.</p>
383 <p>Cette politique est implémentée par le filtre
384 <strong>POLICY_KEEPALIVE</strong>.</p>
388 <section id="policymaxage">
389 <title>Durée de fraîcheur / Politique de gestion de l'âge maximum</title>
392 <module>mod_policy</module>
395 <directive module="mod_policy">PolicyMaxage</directive>
399 <p>Cette politique se verra rejetée si la réponse du serveur ne
400 contient pas de <strong>durée de fraîcheur</strong> explicite au
401 moins grande que la limite définie par le serveur, ou si la
402 durée de fraîcheur est calculée à partir d'une heuristique.</p>
404 <p>Vous trouverez tous les détails à propos du calcul d'une durée de
405 fraîcheur dans la <a
406 href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.2">RFC2616
407 section 13.2 Expiration Model</a>.</p>
409 <p>Pendant la durée de fraîcheur, un cache n'a pas besoin de
410 contacter le serveur original, et il peut renvoyer le contenu situé
411 dans le cache tel quel au client.</p>
413 <p>Lorsque la date de péremption est atteinte, le cache doit
414 contacter le serveur original dans le but de vérifier si le contenu
415 situé dans le cache est encore à jour, et si ce n'est pas le cas, de
416 le remplacer par le contenu correspondant sur le serveur original.</p>
418 <p>Lorsque la durée de fraîcheur est trop courte, il peut en
419 résulter un excès de charge pour le serveur. De plus, si une
420 interruption de service survient, et si cette dernière est longue,
421 ou plus longue que la durée de fraîcheur, tout le contenu du cache
422 s'en trouvera périmé, ce qui causera un trafic très important
423 lorsque le serveur ou le réseau sera rétabli.</p>
425 <p>Cette politique est implémentée par le filtre
426 <strong>POLICY_MAXAGE</strong>.</p>
430 <section id="policynocache">
431 <title>Politique de gestion des contenus qui ne peuvent pas être mis
435 <module>mod_policy</module>
438 <directive module="mod_policy">PolicyNocache</directive>
442 <p>Cette politique sera rejetée si la réponse du serveur
443 déclare elle-même qu'elle ne doit pas être mise en cache à l'aide
444 d'un en-tête <code>Cache-Control</code> ou <code>Pragma</code>.</p>
446 <p>Vous trouverez tous les détails à propos de la manière dont un
447 contenu peut être déclaré comme non cachable dans la <a
448 href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1">RFC2616
449 section 14.9.1 What is Cacheable</a>, et au sein de la définition de
450 l'en-tête <code>Pragma</code> dans la <a
451 href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.32">RFC2616
452 section 14.32 Pragma</a>.</p>
454 <p>Plus précisément, si une combinaison des en-têtes suivants existe
455 dans la réponse, cette dernière sera rejetée :</p>
458 <li><code>Cache-Control: no-cache</code></li>
459 <li><code>Cache-Control: no-store</code></li>
460 <li><code>Cache-Control: private</code></li>
461 <li><code>Pragma: no-cache</code></li>
464 <p>D'une manière générale, lorsque cette politique est activée, et
465 si d'une manière inattendue un contenu non cachable peut induire un
466 niveau de charge du serveur inacceptable, tout contenu défini comme
467 non cachable par le serveur sera rejeté.</p>
469 <p>Cette politique est implémentée par le filtre
470 <strong>POLICY_NOCACHE</strong>.</p>
474 <section id="policyvalidation">
475 <title>Politique de validation</title>
478 <module>mod_policy</module>
481 <directive module="mod_policy">PolicyValidation</directive>
485 <p>Cette politique sera rejetée si la réponse du serveur
486 ne contient aucune en-tête syntaxiquement correct <code>ETag</code>
487 ou <code>Last-Modified</code>.</p>
489 <p>Vous trouverez une description complète de l'en-tête
490 <code>ETag</code> dans la <a
491 href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.19">RFC2616
492 section 14.19 Etag</a>, et de l'en-tête <code>Last-Modified</code>
494 href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.29">RFC2616
495 section 14.29 Last-Modified</a>.</p>
497 <p>La vérification est effectuée non seulement en ce qui concerne la
498 présence des en-têtes, mais aussi du point de vue de leur syntaxe.</p>
500 <p>Si une en-tête <code>ETag</code> n'est pas entourée de guillemets,
501 ou n'est pas déclarée "weak" en le préfixant avec un "W/", la politique
502 sera rejetée. De même, si l'interprétation d'une en-tête
503 <code>Last-Modified</code> ne fournit pas de date valide, la réponse
504 sera rejetée.</p>
506 <p>Cette politique est implémentée par le filtre
507 <strong>POLICY_VALIDATION</strong>.</p>
511 <section id="policyvary">
512 <title>Politique de gestion de l'en-tête Vary</title>
515 <module>mod_policy</module>
518 <directive module="mod_policy">PolicyVary</directive>
522 <p>Cette politique se verra rejetée si la réponse du serveur
523 contient une en-tête <code>Vary</code>, et si cette en-tête
524 contient à son tour une en-tête mise en liste noire par
525 l'administrateur.</p>
527 <p>L'en-tête <code>Vary</code> est décrite en détails dans la <a
528 href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.44">RFC2616
529 section 14.44 Vary</a>.</p>
531 <p>Certaines en-têtes définies par les clients, comme
532 <code>User-Agent</code>, peuvent contenir des milliers ou même des
533 millions de combinaisons de valeurs au cours du temps, et si la
534 réponse est considérée comme pouvant être mise en cache, le cache
535 peut tenter d'enregistrer toutes ces réponses, ce qui peut l'amener
536 à saturation et à noyer les autres entrées qu'il contient. Avec ce
537 scénario, cette politique sera rejetée.</p>
539 <p>Cette politique est implémentée par le filtre
540 <strong>POLICY_VARY</strong>.</p>
544 <section id="policyversion">
545 <title>Politique de gestion des versions de protocole</title>
548 <module>mod_policy</module>
551 <directive module="mod_policy">PolicyVersion</directive>
555 <p>Cette politique sera rejetée si la réponse du serveur
556 a été générée avec un numéro de version inférieur à la version
557 de HTTP spécifiée.</p>
559 <p>Cette politique s'utilise en général avec les applications qui
560 nécessitent un contrôle du type du client. Elle peut être utilisée en
561 concomitance avec le filtre <code>POLICY_KEEPALIVE</code> afin de
562 s'assurer que les clients HTTP/1.0 n'engendrent pas la fermeture des
563 connexions persistantes.</p>
565 <p>Les versions minimales pouvant être spécifiées sont :</p>
567 <ul><li><code>HTTP/1.1</code></li>
568 <li><code>HTTP/1.0</code></li>
569 <li><code>HTTP/0.9</code></li>
572 <p>Cette politique est implémentée par le filtre
573 <strong>POLICY_VERSON</strong>.</p>