]> granicus.if.org Git - apache/blob - docs/manual/expr.xml.fr
XML update.
[apache] / docs / manual / expr.xml.fr
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 : 1643267 -->
5 <!-- French translation : Lucien GENTIS -->
6 <!-- Reviewed by : Vincent Deffontaines -->
7
8 <!--
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
15
16      http://www.apache.org/licenses/LICENSE-2.0
17
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.
23 -->
24
25 <manualpage metafile="expr.xml.meta">
26
27   <title>Les expressions dans le serveur HTTP Apache</title>
28
29   <summary>
30     <p>Historiquement, il existe de nombreuses variantes dans la syntaxe
31     des expressions permettant d'exprimer une condition dans les
32     diff&eacute;rents modules du serveur HTTP Apache. &Agrave; ce titre, des travaux sont
33     en cours pour n'utiliser qu'une seule variante nomm&eacute;e
34     <em>ap_expr</em>, pour toutes les directives de configuration. Ce
35     document d&eacute;crit l'interpr&eacute;teur d'expressions <em>ap_expr</em>.
36     </p>
37     <p>Le type d'expression <em>ap_expr</em> est appel&eacute; &agrave; remplacer la
38     plupart des autres types d'expressions dans HTTPD. Par exemple, la
39     directive obsol&egrave;te <directive
40     module="mod_ssl">SSLRequire</directive> peut &ecirc;tre remplac&eacute;e par la
41     directive <a href="mod/mod_authz_core.html#reqexpr">Require
42     expr</a>.
43     </p>
44   </summary>
45
46 <seealso><directive module="core">If</directive></seealso>
47 <seealso><directive module="core" type="section">If</directive></seealso>
48 <seealso><directive module="core" type="section">ElseIf</directive></seealso>
49 <seealso><directive module="core" type="section">Else</directive></seealso>
50 <seealso><directive module="mod_auth_basic">AuthBasicFake</directive></seealso>
51 <seealso><directive module="mod_auth_form">AuthFormLoginRequiredLocation</directive></seealso>
52 <seealso><directive module="mod_auth_form">AuthFormLoginSuccessLocation</directive></seealso>
53 <seealso><directive module="mod_auth_form">AuthFormLogoutLocation</directive></seealso>
54 <seealso><directive module="mod_rewrite">RewriteCond</directive></seealso>
55 <seealso><directive module="mod_setenvif">SetEnvIfExpr</directive></seealso>
56 <seealso><directive module="mod_headers">Header</directive></seealso>
57 <seealso><directive module="mod_headers">RequestHeader</directive></seealso>
58 <seealso><directive module="mod_filter">FilterProvider</directive></seealso>
59 <seealso><a href="mod/mod_authz_core.html#reqexpr">Require expr</a></seealso>
60 <seealso><a href="mod/mod_authnz_ldap.html#requser">Require ldap-user</a></seealso>
61 <seealso><a href="mod/mod_authnz_ldap.html#reqgroup">Require ldap-group</a></seealso>
62 <seealso><a href="mod/mod_authnz_ldap.html#reqdn">Require ldap-dn</a></seealso>
63 <seealso><a href="mod/mod_authnz_ldap.html#reqattribute">Require ldap-attribute</a></seealso>
64 <seealso><a href="mod/mod_authnz_ldap.html#reqfilter">Require ldap-filter</a></seealso>
65 <seealso><a href="mod/mod_authnz_ldap.html#reqsearch">Require ldap-search</a></seealso>
66 <seealso><a href="mod/mod_authz_dbd.html#reqgroup">Require dbd-group</a></seealso>
67 <seealso><a href="mod/mod_authz_dbm.html#reqgroup">Require dbm-group</a></seealso>
68 <seealso><a href="mod/mod_authz_groupfile.html#reqgroup">Require group</a></seealso>
69 <seealso><a href="mod/mod_authz_host.html#reqhost">Require host</a></seealso>
70 <seealso><directive module="mod_ssl">SSLRequire</directive></seealso>
71 <seealso><directive module="mod_log_debug">LogMessage</directive></seealso>
72 <seealso><module>mod_include</module></seealso>
73
74   <section id="grammar">
75     <title>Syntaxe en Forme de Backus-Naur</title>
76       <p>La <a href="http://fr.wikipedia.org/wiki/Forme_de_Backus-Naur">Forme de Backus-Naur</a>
77       (souvent abr&eacute;g&eacute;e en BNF, de l'anglais Backus-Naur Form) est une notation permettant de d&eacute;crire
78       les r&egrave;gles syntaxiques des langages de programmation. En
79       g&eacute;n&eacute;ral, les expressions repr&eacute;sentent des valeurs bool&eacute;ennes. Dans
80       ce cas, le point de d&eacute;part de la BNF est <code>expr</code>.
81       Cependant, certaines directives comme <directive
82       module="mod_log_debug">LogMessage</directive> utilisent comme
83       param&egrave;tres des expressions qui repr&eacute;sentent des cha&icirc;nes de
84       caract&egrave;res. Dans ce cas, le point de d&eacute;part de la BNF est
85       <code>string</code>.
86       </p>
87 <blockquote>
88 <pre>
89 expr        ::= "<strong>true</strong>" | "<strong>false</strong>"
90               | "<strong>!</strong>" expr
91               | expr "<strong>&amp;&amp;</strong>" expr
92               | expr "<strong>||</strong>" expr
93               | "<strong>(</strong>" expr "<strong>)</strong>"
94               | comp
95
96 comp        ::= stringcomp
97               | integercomp
98               | unaryop word
99               | word binaryop word
100               | word "<strong>in</strong>" "<strong>{</strong>" wordlist "<strong>}</strong>"
101               | word "<strong>in</strong>" listfunction
102               | word "<strong>=~</strong>" regex
103               | word "<strong>!~</strong>" regex
104
105
106 stringcomp  ::= word "<strong>==</strong>" word
107               | word "<strong>!=</strong>" word
108               | word "<strong>&lt;</strong>"  word
109               | word "<strong>&lt;=</strong>" word
110               | word "<strong>&gt;</strong>"  word
111               | word "<strong>&gt;=</strong>" word
112
113 integercomp ::= word "<strong>-eq</strong>" word | word "<strong>eq</strong>" word
114               | word "<strong>-ne</strong>" word | word "<strong>ne</strong>" word
115               | word "<strong>-lt</strong>" word | word "<strong>lt</strong>" word
116               | word "<strong>-le</strong>" word | word "<strong>le</strong>" word
117               | word "<strong>-gt</strong>" word | word "<strong>gt</strong>" word
118               | word "<strong>-ge</strong>" word | word "<strong>ge</strong>" word
119
120 wordlist    ::= word
121               | wordlist "<strong>,</strong>" word
122
123 word        ::= word "<strong>.</strong>" word
124               | digit
125               | "<strong>'</strong>" string "<strong>'</strong>"
126               | "<strong>"</strong>" string "<strong>"</strong>"
127               | variable
128               | rebackref
129               | function
130
131 string      ::= stringpart
132               | string stringpart
133
134 stringpart  ::= cstring
135               | variable
136               | rebackref
137
138 cstring     ::= ...
139 digit       ::= [0-9]+
140
141 variable    ::= "<strong>%{</strong>" varname "<strong>}</strong>"
142               | "<strong>%{</strong>" funcname "<strong>:</strong>" funcargs "<strong>}</strong>"
143
144 rebackref   ::= "<strong>$</strong>" [0-9]
145
146 function     ::= funcname "<strong>(</strong>" wordlist "<strong>)</strong>"
147
148 listfunction ::= listfuncname "<strong>(</strong>" word "<strong>)</strong>"
149 </pre>
150 </blockquote>
151 </section>
152
153 <section id="vars">
154     <title>Variables</title>
155
156     <p>L'interpr&eacute;teur d'expressions fournit plusieurs variables de la
157     forme <code>%{HTTP_HOST}</code>. Notez que la valeur d'une variable
158     peut d&eacute;pendre de la phase du traitement de la requ&ecirc;te au cours de
159     laquelle elle est &eacute;valu&eacute;e. Par exemple, une expression utilis&eacute;e dans
160     une directive <directive>&lt;If &gt;</directive> sera &eacute;valu&eacute;e avant
161     la phase d'authentification. Par cons&eacute;quent, la variable
162     <code>%{REMOTE_USER}</code> ne sera pas encore d&eacute;finie &agrave; ce stade.</p>
163
164     <p>Les variables suivantes contiennent la valeur de l'en-t&ecirc;te de
165     requ&ecirc;te HTTP correspondant. La <a href="#functions">fonction</a>
166     <code>req</code> permet d'extraire les valeurs des autres
167     en-t&ecirc;tes. L'utilisation de ces variables peut provoquer
168     l'ajout du nom d'en-t&ecirc;te correspondant &agrave; l'en-t&ecirc;te Vary de la
169     r&eacute;ponse HTTP, sauf sp&eacute;cification contraire pour la directive
170     qui accepte l'expression comme param&egrave;tre. La <a
171     href="#functions">function</a> <code>req_novary</code> permet de
172     modifier ce comportement.</p>
173
174     <table border="1" style="zebra">
175     <columnspec><column width="1"/></columnspec>
176
177     <tr><th>Nom</th></tr>
178     <tr><td><code>HTTP_ACCEPT</code></td></tr>
179     <tr><td><code>HTTP_COOKIE</code></td></tr>
180     <tr><td><code>HTTP_FORWARDED</code></td></tr>
181     <tr><td><code>HTTP_HOST</code></td></tr>
182     <tr><td><code>HTTP_PROXY_CONNECTION</code></td></tr>
183     <tr><td><code>HTTP_REFERER</code></td></tr>
184     <tr><td><code>HTTP_USER_AGENT</code></td></tr>
185
186     </table>
187
188     <p>Autres variables li&eacute;es aux requ&ecirc;tes</p>
189
190     <table border="1" style="zebra">
191     <columnspec><column width=".4"/><column width=".6"/></columnspec>
192
193     <tr><th>Nom</th><th>Description</th></tr>
194     <tr><td><code>REQUEST_METHOD</code></td>
195         <td>La m&eacute;thode HTTP de la requ&ecirc;te entrante (par exemple
196         <code>GET</code>)</td></tr>
197     <tr><td><code>REQUEST_SCHEME</code></td>
198         <td>Le protocole associ&eacute; &agrave; l'URI de la requ&ecirc;te</td></tr>
199     <tr><td><code>REQUEST_URI</code></td>
200         <td>La partie chemin de l'URI de la requ&ecirc;te</td></tr>
201     <tr><td><code>DOCUMENT_URI</code></td>
202         <td>Idem <code>REQUEST_URI</code></td></tr>
203     <tr><td><code>REQUEST_FILENAME</code></td>
204         <td>Le chemin complet dans le syst&egrave;me de fichiers local du
205         fichier ou du script correspondant &agrave; la requ&ecirc;te, si le serveur
206         l'a d&egrave;j&agrave; d&eacute;termin&eacute; &agrave; l'instant o&ugrave; <code>REQUEST_FILENAME</code>
207         est r&eacute;f&eacute;renc&eacute;e. Dans le cas contraire, comme dans un
208         contexte de serveur virtuel, m&ecirc;me valeur que <code>REQUEST_URI</code> </td></tr>  
209     <tr><td><code>SCRIPT_FILENAME</code></td>
210         <td>Identique &agrave; <code>REQUEST_FILENAME</code></td></tr>
211     <tr><td><code>LAST_MODIFIED</code></td>
212         <td>La date et heure de derni&egrave;re modification du fichier au
213         format <code>20101231235959</code>, si elle est d&eacute;j&agrave; connue du
214         serveur au moment o&ugrave; <code>LAST_MODIFIED</code> est r&eacute;f&eacute;renc&eacute;.
215         </td></tr>
216     <tr><td><code>SCRIPT_USER</code></td>
217         <td>Le nom d'utilisateur du propri&eacute;taire du script.</td></tr>
218     <tr><td><code>SCRIPT_GROUP</code></td>
219         <td>Le nom du groupe auquel appartient le script.</td></tr>
220     <tr><td><code>PATH_INFO</code></td>
221         <td>L'information relative au nom de chemin situ&eacute;e en fin, voir
222         la directive <directive module="core">AcceptPathInfo</directive></td></tr>
223     <tr><td><code>QUERY_STRING</code></td>
224         <td>La cha&icirc;ne de param&egrave;tres de la requ&ecirc;te courante</td></tr>
225     <tr><td><code>IS_SUBREQ</code></td>
226         <td>"<code>true</code>" si la requ&ecirc;te courante est une
227         sous-requ&ecirc;te, "<code>false</code>" dans le cas contraire</td></tr>
228     <tr><td><code>THE_REQUEST</code></td>
229         <td>La requ&ecirc;te compl&egrave;te (par exemple "<code>GET /index.html
230         HTTP/1.1</code>")</td></tr>
231     <tr><td><code>REMOTE_ADDR</code></td>
232         <td>L'adresse IP de l'h&ocirc;te distant</td></tr>
233     <tr><td><code>REMOTE_HOST</code></td>
234         <td>Le nom d'h&ocirc;te de l'h&ocirc;te distant</td></tr>
235     <tr><td><code>REMOTE_USER</code></td>
236         <td>Le nom de l'utilisateur authentifi&eacute;, s'il existe (non
237         disponible &agrave; l'int&eacute;rieur d'un bloc <directive>&lt;If&gt;</directive>)</td></tr>
238     <tr><td><code>REMOTE_IDENT</code></td>
239         <td>Le nom de l'utilisateur d&eacute;fini par <module>mod_ident</module></td></tr>
240     <tr><td><code>SERVER_NAME</code></td>
241         <td>La valeur de la directive <directive
242         module="core">ServerName</directive> du serveur virtuel courant</td></tr>
243     <tr><td><code>SERVER_PORT</code></td>
244         <td>Le port associ&eacute; au serveur virtuel courant ; voir la
245         directive <directive module="core">ServerName</directive></td></tr>
246     <tr><td><code>SERVER_ADMIN</code></td>
247         <td>La valeur de la directive <directive
248         module="core">ServerAdmin</directive> du serveur virtuel courant</td></tr>
249     <tr><td><code>SERVER_PROTOCOL</code></td>
250         <td>Le protocole utilis&eacute; par la requ&ecirc;te (par
251         exemple HTTP/1.1). Avec certains types de sous-requ&ecirc;tes
252         internes, cette variable prend la valeur <code>INCLUDED</code>.</td></tr>
253     <tr><td><code>SERVER_PROTOCOL_VERSION</code></td>
254         <td>Un nombre qui repr&eacute;sente la version HTTP de la requ&ecirc;te :
255         <code>1000 * major + minor</code>. Par exemple,
256         <code>1001</code> correspond &agrave; HTTP/1.1 et <code>9</code> &agrave;
257         HTTP/0.9.</td></tr>
258     <tr><td><code>SERVER_PROTOCOL_VERSION_MAJOR</code></td>
259         <td>La partie majeure de la version HTTP de la requ&ecirc;te, par
260         exemple <code>1</code> pour HTTP/1.0.</td></tr>
261     <tr><td><code>SERVER_PROTOCOL_VERSION_MINOR</code></td>
262         <td>La partie mineure de la version HTTP de la requ&ecirc;te, par
263         exemple <code>0</code> pour HTTP/1.0.</td></tr>
264     <tr><td><code>DOCUMENT_ROOT</code></td>
265         <td>La valeur de la directive <directive
266         module="core">DocumentRoot</directive> du serveur virtuel
267         courant</td></tr>
268     <tr><td><code>AUTH_TYPE</code></td>
269         <td>La valeur de la directive <directive
270         module="mod_authn_core">AuthType</directive> (par exemple
271         "<code>basic</code>")</td></tr>
272     <tr><td><code>CONTENT_TYPE</code></td>
273         <td>Le type de contenu de la r&eacute;ponse (non
274         disponible &agrave; l'int&eacute;rieur d'un bloc <directive>&lt;If&gt;</directive>)</td></tr>
275     <tr><td><code>HANDLER</code></td>
276         <td>Le nom du <a href="handler.html">gestionnaire</a> qui a
277         g&eacute;n&eacute;r&eacute; la r&eacute;ponse</td></tr>
278     <tr><td><code>HTTPS</code></td>
279         <td>"<code>on</code>" si la requ&ecirc;te utilise https,
280         "<code>off</code>" dans le cas contraire</td></tr>
281     <tr><td><code>IPV6</code></td>
282         <td>"<code>on</code>" si la connexion utilise IPv6,
283         "<code>off</code>" dans le cas contraire</td></tr>
284     <tr><td><code>REQUEST_STATUS</code></td>
285         <td>Le code d'erreur HTTP de la requ&ecirc;te (non
286         disponible &agrave; l'int&eacute;rieur d'un bloc <directive>&lt;If&gt;</directive>)</td></tr>
287     <tr><td><code>REQUEST_LOG_ID</code></td>
288         <td>L'identifiant du message d'erreur associ&eacute; &agrave; la requ&ecirc;te (voir
289         la directive <directive
290         module="core">ErrorLogFormat</directive>)</td></tr>
291     <tr><td><code>CONN_LOG_ID</code></td>
292         <td>L'identifiant du message d'erreur associ&eacute; &agrave; la connexion
293         (voir la directive <directive
294         module="core">ErrorLogFormat</directive>)</td></tr>
295     <tr><td><code>CONN_REMOTE_ADDR</code></td>
296         <td>L'adresse IP du correspondant pour la connexion (voir le module
297         <module>mod_remoteip</module>)</td></tr>
298     <tr><td><code>CONTEXT_PREFIX</code></td>
299         <td></td></tr>
300     <tr><td><code>CONTEXT_DOCUMENT_ROOT</code></td>
301         <td></td></tr>  
302
303     </table>
304
305     <p>Variables diverses</p>
306
307     <table border="1" style="zebra">
308     <columnspec><column width=".4"/><column width=".6"/></columnspec>
309
310     <tr><th>Nom</th><th>Description</th></tr>
311     <tr><td><code>TIME_YEAR</code></td>
312         <td>L'ann&eacute;e courante (par exemple <code>2010</code>)</td></tr>
313     <tr><td><code>TIME_MON</code></td>
314         <td>Le mois courant (<code>1</code>, ..., <code>12</code>)</td></tr>
315     <tr><td><code>TIME_DAY</code></td>
316         <td>Le jour courant dans le mois</td></tr>
317     <tr><td><code>TIME_HOUR</code></td>
318         <td>Les heures de la date courante (<code>0</code>, ...,
319         <code>23</code>)</td></tr>
320     <tr><td><code>TIME_MIN</code></td>
321         <td>Les minutes de la date courante</td></tr>
322     <tr><td><code>TIME_SEC</code></td>
323         <td>Les secondes de la date courante</td></tr>
324     <tr><td><code>TIME_WDAY</code></td>
325         <td>Le jour de la semaine (&agrave; partir de <code>0</code> pour
326         dimanche)</td></tr>
327     <tr><td><code>TIME</code></td>
328         <td>La date et heure au format <code>20101231235959</code></td></tr>
329     <tr><td><code>SERVER_SOFTWARE</code></td>
330         <td>La cha&icirc;ne contenant la version du serveur</td></tr>
331     <tr><td><code>API_VERSION</code></td>
332         <td>La date de la version de l'API (module magic number)</td></tr>
333     </table>
334
335     <p>Certains modules, comme <module>mod_ssl</module>, d&eacute;finissent des
336     variables suppl&eacute;mentaires.</p>
337
338 </section>
339
340 <section id="binop">
341     <title>Op&eacute;rateurs binaires</title>
342
343     <p>&Agrave; l'exception de quelques op&eacute;rateurs de comparaison internes, les
344     op&eacute;rateurs binaires sont de la forme
345     "<code>-[a-zA-Z][a-zA-Z0-9_]+</code>", autrement dit un signe moins
346     et au moins deux caract&egrave;res. Le nom est insensible &agrave; la casse. Les
347     modules peuvent fournir des op&eacute;rateurs binaires suppl&eacute;mentaires.</p>
348
349     <section id="comp">
350     <title>Op&eacute;rateurs de comparaison</title>
351
352     <table border="1" style="zebra">
353     <columnspec><column width=".2"/><column width=".2"/><column width=".6"/></columnspec>
354
355     <tr><th>Nom</th><th>Alternative</th> <th>Description</th></tr>
356     <tr><td><code>==</code></td>
357         <td><code>=</code></td>
358         <td>Egalit&eacute; de cha&icirc;nes</td></tr>
359     <tr><td><code>!=</code></td>
360         <td></td>
361         <td>In&eacute;galit&eacute; de cha&icirc;nes</td></tr>
362     <tr><td><code>&lt;</code></td>
363         <td></td>
364         <td>Cha&icirc;ne inf&eacute;rieure &agrave;</td></tr>
365     <tr><td><code>&lt;=</code></td>
366         <td></td>
367         <td>Cha&icirc;ne inf&eacute;rieure ou &eacute;gale &agrave;</td></tr>
368     <tr><td><code>&gt;</code></td>
369         <td></td>
370         <td>Cha&icirc;ne sup&eacute;rieure &agrave;</td></tr>
371     <tr><td><code>&gt;=</code></td>
372         <td></td>
373         <td>Cha&icirc;ne sup&eacute;rieure ou &eacute;gale &agrave;</td></tr>
374     <tr><td><code>=~</code></td>
375         <td></td>
376         <td>La cha&icirc;ne correspond &agrave; l'expression rationnelle</td></tr>
377     <tr><td><code>!~</code></td>
378         <td></td>
379         <td>La cha&icirc;ne ne correspond pas &agrave; l'expression rationnelle</td></tr>       
380     <tr><td><code>-eq</code></td>
381         <td><code>eq</code></td>
382         <td>Egalit&eacute; d'entiers</td></tr>
383     <tr><td><code>-ne</code></td>
384         <td><code>ne</code></td>
385         <td>In&eacute;galit&eacute; d'entiers</td></tr>
386     <tr><td><code>-lt</code></td>
387         <td><code>lt</code></td>
388         <td>Entier inf&eacute;rieur &agrave;</td></tr>
389     <tr><td><code>-le</code></td>
390         <td><code>le</code></td>
391         <td>Entier inf&eacute;rieur ou &eacute;gal &agrave;</td></tr>
392     <tr><td><code>-gt</code></td>
393         <td><code>gt</code></td>
394         <td>Entier sup&eacute;rieur &agrave;</td></tr>
395     <tr><td><code>-ge</code></td>
396         <td><code>ge</code></td>
397         <td>Entier sup&eacute;rieur ou &eacute;gal &agrave;</td></tr>
398     </table>
399     </section>
400
401     <section id="binaryother">
402     <title>Autres op&eacute;rateurs binaires</title>
403
404     <table border="1" style="zebra">
405     <columnspec><column width=".2"/><column width=".8"/></columnspec>
406
407     <tr><th>Nom</th><th>Description</th></tr>
408     <tr><td><code>-ipmatch</code></td>
409         <td>L'adresse IP correspond &agrave; adresse/masque</td></tr>
410     <tr><td><code>-strmatch</code></td>
411         <td>la cha&icirc;ne de gauche correspond au mod&egrave;le constitu&eacute; par la
412         cha&icirc;ne de droite (contenant des caract&egrave;res g&eacute;n&eacute;riques *, ?, [])</td></tr>
413     <tr><td><code>-strcmatch</code></td>
414         <td>idem <code>-strmatch</code>, mais insensible &agrave; la casse</td></tr>
415     <tr><td><code>-fnmatch</code></td>
416         <td>idem <code>-strmatch</code>, mais les slashes ne sont pas
417         pris en compte par les caract&egrave;res g&eacute;n&eacute;riques</td></tr>
418     </table>
419     </section>
420
421 </section>
422
423 <section id="unnop">
424     <title>Op&eacute;rateurs unaires</title>
425
426     <p>Les op&eacute;rateurs unaires acceptent un seul argument et sont
427     de la forme "<code>-[a-zA-Z]</code>",
428     autrement dit le signe moins et un caract&egrave;re. Le nom <em>est</em>
429     sensible &agrave; la casse. Les modules peuvent fournir des op&eacute;rateurs
430     unaires suppl&eacute;mentaires.</p>
431
432     <table border="1" style="zebra">
433     <columnspec><column width=".2"/><column width=".2"/><column width=".6"/></columnspec>
434
435     <tr><th>Nom</th><th>Description</th><th>Restreint</th></tr>
436     <tr><td><code>-d</code></td>
437         <td>L'argument est trait&eacute; comme un nom de fichier. 
438         Vrai si le fichier existe et correspond &agrave; un
439         r&eacute;pertoire</td><td>oui</td></tr>
440     <tr><td><code>-e</code></td>
441         <td>L'argument est trait&eacute; comme un nom de fichier. Vrai si le
442         fichier (ou dir ou special) existe</td><td>oui</td></tr>
443     <tr><td><code>-f</code></td>
444         <td>L'argument est trait&eacute; comme un nom de fichier. Vrai si le
445         fichier existe et correspond &agrave; un fichier
446         r&eacute;gulier</td><td>oui</td></tr>
447     <tr><td><code>-s</code></td>
448         <td>L'argument est trait&eacute; comme un nom de fichier. Vrai si le
449         fichier existe et n'est pas vide</td><td>oui</td></tr>
450     <tr><td><code>-L</code></td>
451         <td>L'argument est trait&eacute; comme un nom de fichier. Vrai si le
452         fichier existe et correspond &agrave; un lien
453         symbolique</td><td>oui</td></tr>
454     <tr><td><code>-h</code></td>
455         <td>L'argument est trait&eacute; comme un nom de fichier. Vrai si le
456         fichier existe et correspond &agrave; un lien symbolique
457         (identique &agrave; <code>-L</code>)</td><td>oui</td></tr>
458     <tr><td><code>-F</code></td>
459         <td>Vrai si la cha&icirc;ne correspond a un fichier valide, accessible
460         avec tous les contr&ocirc;les d'acc&egrave;s configur&eacute;s pour ce chemin. A
461         cette fin, une sous-requ&ecirc;te effectue la v&eacute;rification, et vous
462         devez utiliser ce drapeau avec soin car il peut impacter les
463         performances de votre serveur !</td><td></td></tr>
464     <tr><td><code>-U</code></td>
465         <td>Vrai si la cha&icirc;ne correspond a une URL valide, accessible
466         avec tous les contr&ocirc;les d'acc&egrave;s configur&eacute;s pour ce chemin. A
467         cette fin, une sous-requ&ecirc;te effectue la v&eacute;rification, et vous
468         devez utiliser ce drapeau avec soin car il peut impacter les
469         performances de votre serveur !</td><td></td></tr>
470     <tr><td><code>-A</code></td>
471         <td>Alias pour <code>-U</code></td><td></td></tr>
472     <tr><td><code>-n</code></td>
473         <td>Vrai si la cha&icirc;ne n'est pas vide</td><td></td></tr>
474     <tr><td><code>-z</code></td>
475         <td>Vrai si la cha&icirc;ne est vide</td><td></td></tr>
476     <tr><td><code>-T</code></td>
477         <td>Faux si la cha&icirc;ne est vide, "<code>0</code>",
478         "<code>off</code>", "<code>false</code>", ou "<code>no</code>"
479         (insensibilit&eacute; &agrave; la casse). Vrai dans le cas contraire.</td><td></td></tr>
480     <tr><td><code>-R</code></td>
481         <td>Idem "<code>%{REMOTE_ADDR} -ipmatch ...</code>", en plus
482         efficace
483         </td><td></td></tr>
484     </table>
485
486     <p>Les op&eacute;rateurs marqu&eacute;s comme "restreints" ne sont pas disponibles
487     avec certains modules comme <module>mod_include</module>.</p>
488
489 </section>
490
491 <section id="functions">
492     <title>Fonctions</title>
493
494     <p>Normalement, les fonctions dont la valeur est une cha&icirc;ne acceptent une cha&icirc;ne
495     comme argument et renvoient une cha&icirc;ne. Les noms de fonctions sont
496     insensibles &agrave; la casse. Les modules peuvent fournir des fonctions
497     suppl&eacute;mentaires.</p>
498
499     <table border="1" style="zebra">
500     <columnspec><column width=".2"/><column width=".4"/><column width=".4"/></columnspec>
501
502     <tr><th>Nom</th><th>Description</th><th>Restreint</th></tr>
503     <tr><td><code>req</code>, <code>http</code></td>
504         <td>Lit l'en-t&ecirc;te de requ&ecirc;te HTTP ; les noms
505         d'en-t&ecirc;te correspondants peuvent &ecirc;tre ajout&eacute;s &agrave; l'en-t&ecirc;te Vary,
506         voir ci-dessous</td><td></td></tr>
507     <tr><td><code>req_novary</code></td>
508         <td>Identique &agrave; <code>req</code>, mais les noms
509         d'en-t&ecirc;te correspondants ne seront pas ajout&eacute;s &agrave; l'en-t&ecirc;te Vary</td><td></td></tr>
510     <tr><td><code>resp</code></td>
511         <td>Lit l'en-t&ecirc;te de r&eacute;ponse HTTP (la plupart des
512         en-t&ecirc;te de la r&eacute;ponse ne sont pas encore d&eacute;finis pendant
513         l'ex&eacute;cution de la directive <directive>&lt;If&gt;</directive>)</td><td></td></tr>
514     <tr><td><code>reqenv</code></td>
515         <td>Recherche une variable d'environnement de requ&ecirc;te (on
516         peut aussi utiliser le raccourci <code>v</code>).</td><td></td></tr>
517     <tr><td><code>osenv</code></td>
518         <td>Recherche une variable d'environnement du syst&egrave;me
519         d'exploitation</td><td></td></tr>
520     <tr><td><code>note</code></td>
521         <td>Recherche une note de requ&ecirc;te</td><td></td></tr>
522     <tr><td><code>env</code></td>
523         <td>Renvoie le premier r&eacute;sultat positif de <code>note</code>,
524         <code>reqenv</code>, <code>osenv</code></td><td></td></tr>
525     <tr><td><code>tolower</code></td>
526         <td>Convertit une cha&icirc;ne en minuscules</td><td></td></tr>
527     <tr><td><code>toupper</code></td>
528         <td>Convertit une cha&icirc;ne en majuscules</td><td></td></tr>
529     <tr><td><code>escape</code></td>
530         <td>Echappe les caract&egrave;res sp&eacute;ciaux en codage hexad&eacute;cimal</td><td></td></tr>
531     <tr><td><code>unescape</code></td>
532         <td>"D&eacute;s&eacute;chappe" les cha&icirc;nes cod&eacute;es
533         en hexad&eacute;cimal, en ne gardant encod&eacute;s que les slashes; renvoie la cha&icirc;ne vide
534         si la s&eacute;quence %00 est rencontr&eacute;e</td><td></td></tr>
535     <tr><td><code>base64</code></td>
536         <td>Encode la cha&icirc;ne en utilisant le codage base64</td><td></td></tr>
537     <tr><td><code>unbase64</code></td>
538         <td>D&eacute;code une cha&icirc;ne cod&eacute;e en base64, renvoie une cha&icirc;ne
539         tronqu&eacute;e si le caract&egrave;re 0x00 est rencontr&eacute;</td><td></td></tr>
540     <tr><td><code>md5</code></td>
541         <td>Effectue un hashage MD5 de la cha&icirc;ne, puis encode le hash
542         avec un codage hexad&eacute;cimal</td><td></td></tr>
543     <tr><td><code>sha1</code></td>
544         <td>Effectue un hashage SHA1 de la cha&icirc;ne, puis encode le hash
545         avec un codage hexad&eacute;cimal</td><td></td></tr>   
546     <tr><td><code>file</code></td>
547         <td>Lit le contenu d'un fichier (fins de lignes incluses, si
548         elles existent)</td><td>oui</td></tr>
549     <tr><td><code>filesize</code></td>
550         <td>Renvoie la taille d'un fichier (ou 0 si le fichier n'existe
551         pas ou ne correspond pas &agrave; un fichier
552         r&eacute;gulier)</td><td>oui</td></tr>
553     <tr><td><code>ldap</code></td>
554         <td>Echappe les caract&egrave;res selon la RFC4514 (Echappement des
555         noms distinctifs LDAP - DN) et la RFC4515 (Echappement des
556         filtres LDAP).</td><td></td></tr>
557     <tr><td><code>replace</code></td>
558         <td>replace(cha&icirc;ne, "de", "vers") remplace dans la cha&icirc;ne
559         sp&eacute;cifi&eacute;e toutes les occurrences de "de" par "vers".</td><td></td></tr>
560
561     </table>
562
563     <p>Les fonctions marqu&eacute;es comme "restreints" ne sont pas disponibles
564     avec certains modules comme <module>mod_include</module>.</p>
565
566     <p>Lorsque les fonctions <code>req</code> ou <code>http</code> sont
567     utilis&eacute;es, le nom d'en-t&ecirc;te sera automatiquement ajout&eacute; &agrave; l'en-t&ecirc;te
568     Vary de la r&eacute;ponse HTTP, sauf sp&eacute;cification contraire pour la
569     directive qui accepte l'expression comme param&egrave;tre. La fonction
570     <code>req_novary</code> permet d'emp&ecirc;cher cet ajout.</p>
571
572     <p>En plus des fonctions dont la valeur est une cha&icirc;ne, il existe
573     aussi des fonctions dont la valeur est une liste, qui acceptent une
574     cha&icirc;ne comme argument, et renvoient une liste de mots, autrement dit
575     une liste de cha&icirc;nes. La liste de mot peut &ecirc;tre utilis&eacute;e avec
576     l'op&eacute;rateur sp&eacute;cial <code>-in</code>. Les noms de fonctions sont
577     insensibles &agrave; la casse. Les modules peuvent fournir des fonctions
578     suppl&eacute;mentaires.</p>
579
580     <p>Il n'existe pas de fonctions internes dont la valeur est une
581     liste. Le module <module>mod_ssl</module> fournit la fonction
582     <code>PeerExtList</code>. Voir la description de la directive
583     <directive module="mod_ssl">SSLRequire</directive> pour plus de
584     d&eacute;tails (notez que la fonction <code>PeerExtList</code> peut aussi
585     &ecirc;tre utilis&eacute;e en dehors de la directive <directive
586     module="mod_ssl">SSLRequire</directive>).</p>
587
588 </section>
589 <section id="examples">
590     
591         <title>Exemples d'expressions</title>
592         <p>Les exemples suivants montent comment utiliser les
593         expressions pour &eacute;valuer les requ&ecirc;tes :</p>
594         <!-- This section should probably be extended with more, useful examples -->
595         <highlight language="config">
596 # Comparer le nom d'h&ocirc;te avec example.com et rediriger vers
597 # www.example.com si le nom d'h&ocirc;te correspond
598 &lt;If "%{HTTP_HOST} == 'example.com'"&gt;
599     Redirect permanent / http://www.example.com/
600 &lt;/If&gt;
601
602 # Forcer le type text/plain si un fichier fait l'objet d'une
603 # requ&ecirc;te dont la cha&icirc;ne de param&egrave;tres contient 'forcetext'
604 &lt;If "%{QUERY_STRING} =~ /forcetext/"&gt;
605     ForceType text/plain
606 &lt;/If&gt;
607
608 # N'autoriser l'acc&egrave;s &agrave; ce contenu que pendant les heures de
609 # travail
610 &lt;Directory "/foo/bar/business"&gt;
611      Require expr %{TIME_HOUR} -gt 9 &amp;&amp; %{TIME_HOUR} -lt 17
612 &lt;/Directory&gt;      
613
614 # V&eacute;rifie si un en-t&ecirc;te HTTP correspond &agrave; une des valeurs d'une liste
615 &lt;If "%{HTTP:X-example-header} in { 'foo', 'bar', 'baz' }"&gt;
616     La d&eacute;finition de l'en-t&ecirc;te correspond &agrave; une des valeurs recherch&eacute;es
617 &lt;/If&gt;
618 # Recherche la valeur d'une expression rationnelle dans une variable
619 # d'environnement, et renvoie la n&eacute;gation du r&eacute;sultat.
620 &lt;If "! reqenv('REDIRECT_FOO') =~ /bar/"&gt;
621     La condition est v&eacute;rifi&eacute;e
622 &lt;/If&gt;
623
624 # V&eacute;rifie le r&eacute;sultat de la recherche d'une correspondance d'URI dans un
625 # contexte de r&eacute;pertoire avec l'option -f
626 &lt;Directory /var/www&gt;
627     AddEncoding x-gzip gz
628 &lt;If "-f '%{REQUEST_FILENAME}.unzipme' &amp;&amp; ! %{HTTP:Accept-Encoding} =~ /gzip/"&gt;
629       SetOutputFilter INFLATE
630 &lt;/If&gt;
631 &lt;/Directory&gt;
632
633 # Exemples de fonctions dans un contexte bool&eacute;en
634 &lt;If "md5('foo') == 'acbd18db4cc2f85cedef654fccc4a4d8'"&gt;
635   Header set checksum-matched true
636 &lt;/If&gt;
637 &lt;If "md5('foo') == replace('md5:XXXd18db4cc2f85cedef654fccc4a4d8', 'md5:XXX', 'acb')&gt;
638   Header set checksum-matched-2 true
639 &lt;/If&gt;
640
641 # Function example in string context
642 Header set foo-checksum "expr=%{md5:foo}"
643
644         </highlight>
645 </section>
646
647 <section id="other">
648     <title>Autres</title>
649
650     <table border="1" style="zebra">
651     <columnspec><column width=".2"/><column width=".2"/><column width=".6"/></columnspec>
652
653     <tr><th>Nom</th><th>Alternative</th> <th>Description</th></tr>
654     <tr><td><code>-in</code></td>
655         <td><code>in</code></td>
656         <td>cha&icirc;ne contenue dans une liste de mots</td></tr>
657     <tr><td><code>/regexp/</code></td>
658         <td><code>m#regexp#</code></td>
659         <td>Expression rationnelle (la seconde forme permet de sp&eacute;cifier
660         des d&eacute;limiteurs autres que /)</td></tr>
661     <tr><td><code>/regexp/i</code></td>
662         <td><code>m#regexp#i</code></td>
663         <td>Expression rationnelle insensible &agrave; la casse</td></tr>
664     <tr><td><code>$0 ... $9</code></td>
665         <td></td>
666         <td>R&eacute;f&eacute;rences arri&egrave;res dans les expressions rationnelles</td></tr>
667     </table>
668
669     <section id="rebackref">
670         <title>R&eacute;f&eacute;rences arri&egrave;res dans les expressions rationnelles</title>
671         <p>Les cha&icirc;nes <code>$0</code> ... <code>$9</code> permettent de
672         r&eacute;f&eacute;rencer les groupes de capture en provenance d'expressions
673         rationnelles pr&eacute;c&eacute;demment ex&eacute;cut&eacute;es et mises en correspondance avec
674         succ&egrave;s. Elles ne peuvent normalement &ecirc;tre utilis&eacute;es que dans la
675         m&ecirc;me expression que celle mise en correspondance, mais certains
676         modules permettent de les utiliser de mani&egrave;re sp&eacute;ciale.</p>
677     </section>
678
679 </section>
680
681 <section id="sslrequire">
682     <title>Comparaison avec SSLRequire</title>
683     <p>La syntaxe <em>ap_expr</em> consiste principalement en une
684     surcouche de la syntaxe de la directive obsol&egrave;te <directive
685     module="mod_ssl">SSLRequire</directive>. Vous pouvez consulter la
686     liste de leur diff&eacute;rences dans la documentation de la directive
687     <directive module="mod_ssl">SSLRequire</directive>.</p>
688 </section>
689
690 <section id="compatibility">
691     <title>Historique de version</title>
692     <p>La <a href="#functions">fonction</a> <code>req_novary</code> est
693     disponible &agrave; partir de la version 2.4.4 du serveur HTTP Apache.</p>
694     <p>Les <a href="#vars">variables</a>
695     <code>SERVER_PROTOCOL_VERSION</code>,
696     <code>SERVER_PROTOCOL_VERSION_MAJOR</code> et
697     <code>SERVER_PROTOCOL_VERSION_MINOR</code> sont disponibles &agrave; partir
698     de la version 2.5.0 du serveur HTTP Apache.</p>
699 </section>
700
701 </manualpage>