<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
-<!-- English Revision: 1788508:1811111 (outdated) -->
+<!-- English Revision: 1811111 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
(souvent abrégée en BNF, de l'anglais Backus-Naur Form) est une notation permettant de décrire
les règles syntaxiques des langages de programmation. En
général, les expressions représentent des valeurs booléennes. Dans
- ce cas, le point de départ de la BNF est <code>expr</code>.
- Cependant, certaines directives comme <directive
- module="mod_log_debug">LogMessage</directive> utilisent comme
+ ce cas, le point de départ de la BNF est <code>cond</code>.
+ Les directives comme
+ <directive module="core">ErrorDocument</directive>,
+ <directive module="mod_authz_core">Require</directive>,
+ <directive module="mod_authn_core">AuthName</directive>,
+ <directive module="mod_alias">Redirect</directive>,
+ <directive module="mod_headers">Header</directive>,
+ <directive module="mod_crypto">CryptoKey</directive> ou
+ <directive module="mod_log_debug">LogMessage</directive> utilisent comme
paramètres des expressions qui représentent des chaînes de
caractères. Dans ce cas, le point de départ de la BNF est
<code>string</code>.
</p>
<blockquote>
<pre>
-expr ::= "<strong>true</strong>" | "<strong>false</strong>"
- | "<strong>!</strong>" expr
- | expr "<strong>&&</strong>" expr
- | expr "<strong>||</strong>" expr
- | "<strong>(</strong>" expr "<strong>)</strong>"
+expr ::= cond
+ | string
+
+string ::= substring
+ | string substring
+
+cond ::= "<strong>true</strong>"
+ | "<strong>false</strong>"
+ | "<strong>!</strong>" cond
+ | cond "<strong>&&</strong>" cond
+ | cond "<strong>||</strong>" cond
| comp
+ | "<strong>(</strong>" cond "<strong>)</strong>"
comp ::= stringcomp
| integercomp
| unaryop word
| word binaryop word
- | word "<strong>in</strong>" "<strong>{</strong>" wordlist "<strong>}</strong>"
- | word "<strong>in</strong>" listfunction
+ | word "<strong>in</strong>" listfunc
| word "<strong>=~</strong>" regex
| word "<strong>!~</strong>" regex
+ | word "<strong>in</strong>" "<strong>{</strong>" list "<strong>}</strong>"
stringcomp ::= word "<strong>==</strong>" word
| word "<strong>-gt</strong>" word | word "<strong>gt</strong>" word
| word "<strong>-ge</strong>" word | word "<strong>ge</strong>" word
-wordlist ::= word
- | wordlist "<strong>,</strong>" word
-
-word ::= word "<strong>.</strong>" word
- | digit
+word ::= digits
| "<strong>'</strong>" string "<strong>'</strong>"
- | "<strong>"</strong>" string "<strong>"</strong>"
+ | '<strong>"</strong>' string '<strong>"</strong>'
+ | word "<strong>.</strong>" word
| variable
- | rebackref
+ | sub
+ | join
| function
+ | "<strong>(</strong>" word "<strong>)</strong>"
-string ::= stringpart
- | string stringpart
+list ::= split
+ | listfunc
+ | "<strong>{</strong>" words "<strong>}</strong>"
+ | "<strong>(</strong>" list "<strong>)</strong>"
-stringpart ::= cstring
+substring ::= cstring
| variable
- | rebackref
-cstring ::= ...
-digit ::= [0-9]+
variable ::= "<strong>%{</strong>" varname "<strong>}</strong>"
| "<strong>%{</strong>" funcname "<strong>:</strong>" funcargs "<strong>}</strong>"
+ | "<strong>%{:</strong>" word "<strong>:}</strong>"
+ | "<strong>%{:</strong>" cond "<strong>:}</strong>"
+ | rebackref
+
+sub ::= "<strong>sub</strong>" ["<strong>(</strong>"] regsub "<strong>,</strong>" word ["<strong>)</strong>"]
+
+join ::= "<strong>join</strong>" ["<strong>(</strong>"] list ["<strong>)</strong>"]
+ | "<strong>join</strong>" ["<strong>(</strong>"] list "<strong>,</strong>" word ["<strong>)</strong>"]
+
+split ::= "<strong>split</strong>" ["<strong>(</strong>"] regany "<strong>,</strong>" list ["<strong>)</strong>"]
+ | "<strong>split</strong>" ["<strong>(</strong>"] regany "<strong>,</strong>" word ["<strong>)</strong>"]
+
+function ::= funcname "<strong>(</strong>" words "<strong>)</strong>"
+
+listfunc ::= listfuncname "<strong>(</strong>" words "<strong>)</strong>"
+
+words ::= word
+ | word "<strong>,</strong>" list
-rebackref ::= "<strong>$</strong>" [0-9]
+regex ::= "<strong>/</strong>" regpattern "<strong>/</strong>" [regflags]
+ | "<strong>m</strong>" regsep regpattern regsep [regflags]
-function ::= funcname "<strong>(</strong>" wordlist "<strong>)</strong>"
+regsub ::= "<strong>s</strong>" regsep regpattern regsep string regsep [regflags]
-listfunction ::= listfuncname "<strong>(</strong>" word "<strong>)</strong>"
+regany ::= regex | regsub
+
+regsep ::= "/" | "#" | "$" | "%" | "^" | "|" | "?" | "!" | "'" | '"' | "," | ";" | ":" | "." | "_" | "-"
+
+regflags ::= 1*("i" | "s" | "m" | "g")
+regpattern ::= cstring ; except enclosing <em>regsep</em>
+
+rebackref ::= "<strong>$</strong>" DIGIT
+
+digits ::= 1*(DIGIT)
+cstring ::= 0*(TEXT)
+
+TEXT ::= <any OCTET except CTLs>
+DIGIT ::= <any US-ASCII digit "0".."9">
</pre>
</blockquote>
</section>
<p>Certains modules, comme <module>mod_ssl</module>, définissent des
variables supplémentaires.</p>
+ <p>Toute variable peut être insérée dans une <em>chaîne</em>, et ceci non
+ seulement dans les chaînes entre quotes des expressions booléennes, mais
+ aussi dans les expressions littérales issues de la concaténation de chaînes
+ constantes et dynamiques.</p>
+
+ <p>On peut utiliser ici les variables (temporaires) du style
+ <code>%{:<em>word</em>:}</code> qui permettent d'insérer dans les deux types
+ d'expressions des variables (et des constructions) avec la syntaxe puissante
+ <em>word</em> sans entrer en conflit avec les parties constantes de telles
+ chaînes. Même si la syntaxe <em>word</em> est directement utilisable au sein
+ des expressions booléennes, ces variables sont cependant surtout utiles dans
+ les expressions littérales. Ces variables permettent d'évaluer des
+ expressions rationnelles, des substitutions, de concaténer ou dissocier des
+ chaînes et des listes au sein des expressions littérales, et donc de
+ construire des chaînes complexes dynamiquement.</p>
+
</section>
<section id="binop">
<p>En plus des fonctions dont la valeur est une chaîne, il existe
aussi des fonctions dont la valeur est une liste, qui acceptent une
- chaîne comme argument, et renvoient une liste de mots, autrement dit
- une liste de chaînes. La liste de mot peut être utilisée avec
+ chaîne comme argument, et renvoient une liste , par exemple
+ une liste de chaînes. La liste peut être utilisée avec
l'opérateur spécial <code>-in</code>. Les noms de fonctions sont
insensibles à la casse. Les modules peuvent fournir des fonctions
supplémentaires.</p>
</If>
-# Function example in string context
+# Exemple de fonction dans un contexte littéral
Header set foo-checksum "expr=%{md5:foo}"
# L'exemple suivant retarde l'évaluation de la clause de condition par rapport à
Header always set CustomHeader my-value "expr=%{REQUEST_URI} =~
m#^/special_path\.php$#"
+# Ajoute un en-tête permettant d'acheminer le SAN du certificat d'un client vers
+# un quelconque serveur d'arrière-plan
+RequestHeader set X-Client-SAN "expr=%{:join PeerExtList('subjectAltName'):}"
+
+# Impose la présence de l'adresse IP distante dans le SAN du certificat d'un client
+Require expr %{REMOTE_ADDR} -in split s/.*?IP Address:([^,]+)/$1/, PeerExtList('subjectAltName')
+# autre solution :
+Require expr "IP Address:%{REMOTE_ADDR}" -in split/, /, join PeerExtList('subjectAltName')
+
</highlight>
</section>
<tr><th>Nom</th><th>Alternative</th> <th>Description</th></tr>
<tr><td><code>-in</code></td>
<td><code>in</code></td>
- <td>chaîne contenue dans une liste de mots</td></tr>
+ <td>chaîne contenue dans une liste</td></tr>
<tr><td><code>/regexp/</code></td>
<td><code>m#regexp#</code></td>
<td>Expression rationnelle (la seconde forme permet de spécifier