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