<?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
-<!-- English Revision: 1174747:1334033 (outdated) -->
+<!-- English Revision : 1334033 -->
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
gestionnaire qui associe un suffixe de fichier à une <code>type-map</code>;
ce qui se fait simplement en ajoutant</p>
-<example>AddHandler type-map .var</example>
+<highlight language="config">AddHandler type-map .var</highlight>
<p>dans le fichier de configuration du serveur.</p>
nommé par la directive <directive
module="mod_dir">DirectoryIndex</directive>, si le serveur tente d'indexer
un répertoire. Si les fichiers de configuration spécifient</p>
-<example>DirectoryIndex index</example>
+<highlight language="config">DirectoryIndex index</highlight>
<p>le serveur va choisir entre <code>index.html</code>
et <code>index.html3</code> si les deux fichiers sont présents. Si aucun
n'est présent, mais <code>index.cgi</code> existe,
variante, le processus normal de négociation sera lancé.</p>
<example><title>Exemple</title>
- SetEnvIf Cookie "language=(.+)" prefer-language=$1<br />
- Header append Vary cookie
+ <highlight language="config">
+SetEnvIf Cookie "language=(.+)" prefer-language=$1
+Header append Vary cookie
+ </highlight>
</example>
</section>
</section>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
-<!-- English Revision: 1328334:1333991 (outdated) -->
+<!-- English Revision : 1333991 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
Voici un exemple qui désactive les recherches DNS sauf pour les fichiers
<code>.html</code> et <code>.cgi</code> :</p>
- <example>
- HostnameLookups off<br />
- <Files ~ "\.(html|cgi)$"><br />
- <indent>
- HostnameLookups on<br />
- </indent>
- </Files>
- </example>
+ <highlight language="config">
+HostnameLookups off
+<Files ~ "\.(html|cgi)$">
+ HostnameLookups on
+</Files>
+ </highlight>
<p>Mais même dans ce cas, si vous n'avez besoin de noms DNS que dans
certains CGIs, vous pouvez effectuer l'appel à <code>gethostbyname</code>
symboliques. Un appel supplémentaire par élément du chemin du fichier.
Par exemple, si vous avez :</p>
- <example>
- DocumentRoot /www/htdocs<br />
- <Directory /><br />
- <indent>
- Options SymLinksIfOwnerMatch<br />
- </indent>
- </Directory>
- </example>
+ <highlight language="config">
+DocumentRoot /www/htdocs
+<Directory />
+ Options SymLinksIfOwnerMatch
+</Directory>
+ </highlight>
<p>et si une requête demande l'URI <code>/index.html</code>, Apache
effectuera un appel à <code>lstat(2)</code> pour
vérifier la sécurité des liens symboliques, vous pouvez utiliser une
configuration du style :</p>
- <example>
- DocumentRoot /www/htdocs<br />
- <Directory /><br />
- <indent>
- Options FollowSymLinks<br />
- </indent>
- </Directory><br />
- <br />
- <Directory /www/htdocs><br />
- <indent>
- Options -FollowSymLinks +SymLinksIfOwnerMatch<br />
- </indent>
- </Directory>
- </example>
+ <highlight language="config">
+DocumentRoot /www/htdocs
+<Directory />
+ Options FollowSymLinks
+</Directory>
+
+<Directory /www/htdocs>
+ Options -FollowSymLinks +SymLinksIfOwnerMatch
+</Directory>
+ </highlight>
<p>Ceci évite au moins les vérifications supplémentaires pour le chemin
défini par <directive module="core">DocumentRoot</directive>. Notez que
pour chaque élément du chemin du fichier demandé. Par exemple, si vous
avez : </p>
- <example>
- DocumentRoot /www/htdocs<br />
- <Directory /><br />
- <indent>
- AllowOverride all<br />
- </indent>
- </Directory>
- </example>
+ <highlight language="config">
+DocumentRoot /www/htdocs
+<Directory />
+ AllowOverride all
+</Directory>
+ </highlight>
<p>et qu'une requête demande l'URI <code>/index.html</code>, Apache
tentera d'ouvrir <code>/.htaccess</code>, <code>/www/.htaccess</code>,
Il y a cependant un cas dans lequel vous pouvez accélérer le serveur.
Au lieu d'utiliser une directive générique comme :</p>
- <example>
- DirectoryIndex index
- </example>
+ <highlight language="config">DirectoryIndex index</highlight>
<p>utilisez une liste explicite d'options :</p>
- <example>
- DirectoryIndex index.cgi index.pl index.shtml index.html
- </example>
+ <highlight language="config">DirectoryIndex index.cgi index.pl index.shtml index.html</highlight>
<p>où vous placez le choix courant en première position.</p>
serveurs présentant un traffic important car il possède une empreinte
mémoire plus petite que le MPM prefork.</li>
+ <li>Comme le MPM Worker, le MPM <module>event</module> utilise
+ les threads, mais il a été conçu pour traiter davantage de
+ requêtes simultanément en confiant une partie du travail à des
+ threads de support, ce qui permet aux threads principaux de
+ traiter de nouvelles requêtes.</li>
+
<li>Le MPM <module>prefork</module> utilise plusieurs processus enfants
possédant chacun un seul thread. Chaque processus gère une seule
connexion à la fois. Sur de nombreux systèmes, prefork est comparable
(ces exemples ne sont pas extraits du code d'Apache, ils ne sont
proposés qu'à des fins pédagogiques) :</p>
- <example>
- for (;;) {<br />
- <indent>
- for (;;) {<br />
- <indent>
- fd_set accept_fds;<br />
- <br />
- FD_ZERO (&accept_fds);<br />
- for (i = first_socket; i <= last_socket; ++i) {<br />
- <indent>
- FD_SET (i, &accept_fds);<br />
- </indent>
- }<br />
- rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);<br />
- if (rc < 1) continue;<br />
- new_connection = -1;<br />
- for (i = first_socket; i <= last_socket; ++i) {<br />
- <indent>
- if (FD_ISSET (i, &accept_fds)) {<br />
- <indent>
- new_connection = accept (i, NULL, NULL);<br />
- if (new_connection != -1) break;<br />
- </indent>
- }<br />
- </indent>
- }<br />
- if (new_connection != -1) break;<br />
- </indent>
- }<br />
- process the new_connection;<br />
- </indent>
+ <highlight language="c">
+ for (;;) {
+ for (;;) {
+ fd_set accept_fds;
+
+ FD_ZERO (&accept_fds);
+ for (i = first_socket; i <= last_socket; ++i) {
+ FD_SET (i, &accept_fds);
+ }
+ rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
+ if (rc < 1) continue;
+ new_connection = -1;
+ for (i = first_socket; i <= last_socket; ++i) {
+ if (FD_ISSET (i, &accept_fds)) {
+ new_connection = accept (i, NULL, NULL);
+ if (new_connection != -1) break;
+ }
+ }
+ if (new_connection != -1) break;
+ }
+ process_the(new_connection);
}
- </example>
+ </highlight>
<p>Mais cette implémentation rudimentaire présente une sérieuse lacune.
Rappelez-vous que les processus enfants exécutent cette boucle au même
entrées dans la boucle interne. La boucle ressemble à ceci (les
différences sont mises en surbrillance) :</p>
- <example>
- for (;;) {<br />
- <indent>
- <strong>accept_mutex_on ();</strong><br />
- for (;;) {<br />
- <indent>
- fd_set accept_fds;<br />
- <br />
- FD_ZERO (&accept_fds);<br />
- for (i = first_socket; i <= last_socket; ++i) {<br />
- <indent>
- FD_SET (i, &accept_fds);<br />
- </indent>
- }<br />
- rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);<br />
- if (rc < 1) continue;<br />
- new_connection = -1;<br />
- for (i = first_socket; i <= last_socket; ++i) {<br />
- <indent>
- if (FD_ISSET (i, &accept_fds)) {<br />
- <indent>
- new_connection = accept (i, NULL, NULL);<br />
- if (new_connection != -1) break;<br />
- </indent>
- }<br />
- </indent>
- }<br />
- if (new_connection != -1) break;<br />
- </indent>
- }<br />
- <strong>accept_mutex_off ();</strong><br />
- process the new_connection;<br />
- </indent>
+ <highlight language="c">
+ for (;;) {
+ <strong>accept_mutex_on ();</strong>
+ for (;;) {
+ fd_set accept_fds;
+
+ FD_ZERO (&accept_fds);
+ for (i = first_socket; i <= last_socket; ++i) {
+ FD_SET (i, &accept_fds);
+ }
+ rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
+ if (rc < 1) continue;
+ new_connection = -1;
+ for (i = first_socket; i <= last_socket; ++i) {
+ if (FD_ISSET (i, &accept_fds)) {
+ new_connection = accept (i, NULL, NULL);
+ if (new_connection != -1) break;
+ }
+ }
+ if (new_connection != -1) break;
+ }
+ <strong>accept_mutex_off ();</strong>
+ process the new_connection;
}
- </example>
+ </highlight>
<p><a id="serialize" name="serialize">Les fonctions</a>
<code>accept_mutex_on</code> et <code>accept_mutex_off</code>
<code>http_main.c</code>). La fonction ressemble approximativement à
ceci :</p>
- <example>
- void lingering_close (int s)<br />
- {<br />
- <indent>
- char junk_buffer[2048];<br />
- <br />
- /* shutdown the sending side */<br />
- shutdown (s, 1);<br />
- <br />
- signal (SIGALRM, lingering_death);<br />
- alarm (30);<br />
- <br />
- for (;;) {<br />
- <indent>
- select (s for reading, 2 second timeout);<br />
- if (error) break;<br />
- if (s is ready for reading) {<br />
- <indent>
- if (read (s, junk_buffer, sizeof (junk_buffer)) <= 0) {<br />
- <indent>
- break;<br />
- </indent>
- }<br />
- /* just toss away whatever is here */<br />
- </indent>
- }<br />
- </indent>
- }<br />
- <br />
- close (s);<br />
- </indent>
+ <highlight language="c">
+ void lingering_close (int s)
+ {
+ char junk_buffer[2048];
+
+ /* shutdown the sending side */
+ shutdown (s, 1);
+
+ signal (SIGALRM, lingering_death);
+ alarm (30);
+
+ for (;;) {
+ select (s for reading, 2 second timeout);
+ if (error) break;
+ if (s is ready for reading) {
+ if (read (s, junk_buffer, sizeof (junk_buffer)) <= 0) {
+ break;
+ }
+ /* just toss away whatever is here */
+ }
+ }
+
+ close (s);
}
- </example>
+ </highlight>
<p>Ceci ajoute naturellement un peu de charge à la fin d'une connexion,
mais s'avère nécessaire pour une implémentation fiable. Comme HTTP/1.1
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
-<!-- English Revision: 1300924:1333991 (outdated) -->
+<!-- English revision : 1333991 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
<p>Ajoutez dans le fichier de configuration du serveur</p>
- <example>
- <Directory /> <br />
- AllowOverride None <br />
- </Directory>
- </example>
+ <highlight language="config">
+<Directory />
+ AllowOverride None
+</Directory>
+ </highlight>
<p>Ceci interdit l'utilisation des fichiers <code>.htaccess</code> dans
tous les répertoires, sauf ceux pour lesquels c'est explicitement
fichiers. Pour l'éviter, ajoutez le bloc suivant à la configuration
de votre serveur :</p>
- <example>
- <Directory /> <br />
- Order Deny,Allow <br />
- Deny from all <br />
- </Directory>
- </example>
+ <highlight language="config">
+<Directory />
+ Order Deny,Allow
+ Deny from all
+</Directory>
+ </highlight>
<p>ceci va interdire l'accès par défaut à tous les fichiers du système de
fichiers. Vous devrez ensuite ajouter les blocs
<directive module="core">Directory</directive> appropriés correspondant
aux répertoires auxquels vous voulez autorisez l'accès. Par exemple,</p>
- <example>
- <Directory /usr/users/*/public_html> <br />
- Order Deny,Allow <br />
- Allow from all <br />
- </Directory> <br />
- <Directory /usr/local/httpd> <br />
- Order Deny,Allow <br />
- Allow from all <br />
- </Directory>
- </example>
+ <highlight language="config">
+<Directory /usr/users/*/public_html>
+ Order Deny,Allow
+ Allow from all
+</Directory>
+<Directory /usr/local/httpd>
+ Order Deny,Allow
+ Allow from all
+</Directory>
+ </highlight>
<p>Portez une attention particulière aux interactions entre les directives
<directive module="core">Location</directive> et
fortement d'inclure la ligne suivante dans le fichier de configuration de
votre serveur :</p>
- <example>
- UserDir disabled root
- </example>
+ <highlight language="config">UserDir disabled root</highlight>
</section>
qui signifie que vous avez probablement mis en commentaire ce qui suit dans
le fichier de configuration de votre serveur :</p>
- <example>
- <Files ".ht*"> <br />
- Order allow,deny <br />
- Deny from all <br />
- </Files>
- </example>
+ <highlight language="config">
+<Files ".ht*">
+ Order allow,deny
+ Deny from all
+</Files>
+ </highlight>
</section>
<section id="merging">
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
-<!-- English Revision: 1174747:1335963 (outdated) -->
+<!-- English Revision: 1335963 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
+
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
<!-- TODO: Add discussion here of why we have !^$ in there. -->
-<example>
-RewriteCond %{HTTP_REFERER} <strong>!^$</strong><br />
-RewriteCond %{HTTP_REFERER} !www.example.com [NC]<br />
-RewriteRule <strong>\.(gif|jpg|png)$</strong> - [F,NC]
-</example>
+<highlight language="config">
+RewriteCond %{HTTP_REFERER} !^$
+RewriteCond %{HTTP_REFERER} !www.example.com [NC]
+RewriteRule \.(gif|jpg|png)$ - [F,NC]
+</highlight>
<p>Dans le second exemple, plutôt que de rejeter la requête,
nous affichons une autre image à la place.</p>
-<example>
-RewriteCond %{HTTP_REFERER} <strong>!^$</strong><br />
-RewriteCond %{HTTP_REFERER} !www.example.com [NC]<br />
-RewriteRule <strong>\.(gif|jpg|png)$</strong> /images/go-away.png [R,NC]
-</example>
+<highlight language="config">
+RewriteCond %{HTTP_REFERER} !^$
+RewriteCond %{HTTP_REFERER} !www.example.com [NC]
+RewriteRule \.(gif|jpg|png)$ /images/go-away.png [R,NC]
+</highlight>
<p>Dans le troisième exemple, nous redirigeons la requête vers
une image appartenant à un autre site.</p>
+<highlight language="config">
+RewriteCond %{HTTP_REFERER} !^$
+RewriteCond %{HTTP_REFERER} !www.example.com [NC]
+RewriteRule \.(gif|jpg|png)$ http://other.example.com/image.gif [R,NC]
+</highlight>
-<example>
-RewriteCond %{HTTP_REFERER} <strong>!^$</strong><br />
-RewriteCond %{HTTP_REFERER} !www.example.com [NC]<br />
-RewriteRule <strong>\.(gif|jpg|png)$</strong> http://other.example.com/image.gif [R,NC]
-</example>
<p>De tous ces exemples, les deux derniers semblent les plus
efficaces pour faire en sorte que les gens arrêtent de
référencer vos images à chaud, car il ne verront pas les images
simplement interdire l'accès à la ressource, vous pouvez y
parvenir sans utiliser mod_rewrite :</p>
- <example>
- SetEnvIf Referer exemple\.com localreferer<br />
- <FilesMatch \.(jpg|png|gif)$><br />
- Order deny,allow<br />
- Deny from all<br />
- Allow from env=localreferer<br />
- </FilesMatch>
- </example>
+ <highlight language="config">
+SetEnvIf Referer example\.com localreferer
+<FilesMatch \.(jpg|png|gif)$>
+ Require env localreferer
+</FilesMatch>
+ </highlight>
</dd>
</dl>
<p>Notez qu'il existe des méthodes d'exclusion qui n'utilisent
pas mod_rewrite. Notez aussi que toute technique qui repose sur
le contenu de la chaîne client <code>USER_AGENT</code> peut être
- contournée très facilement car cette chaîne de caractères peut
- être modifiée.</p>
+ contournée très facilement car cette chaîne peut être modifiée.</p>
</dd>
<dt>Solution :</dt>
<dd>
<p>On utilise un jeu de règles qui spécifie le répertoire à
protéger, ainsi que la chaîne client <code>USER_AGENT</code> qui
- identifie le robot indésirable ou envahissant.</p>
+ identifie le robot malin ou envahissant.</p>
<p>Dans cet exemple, nous bloquons un robot nommé
<code>Vilain_Robot</code> pour le répertoire
seulement depuis une source particulière, vous pouvez aussi
spécifier un intervalle d'adresses IP.</p>
-<example>
-RewriteCond %{HTTP_USER_AGENT} ^<strong>Vilain_Robot</strong><br />
-RewriteCond %{REMOTE_ADDR} =<strong>123\.45\.67\.[8-9]</strong><br />
-RewriteRule ^<strong>/secret/fichiers/</strong> - [<strong>F</strong>]
-</example>
+<highlight language="config">
+RewriteCond %{HTTP_USER_AGENT} ^NameOfBadRobot
+RewriteCond %{REMOTE_ADDR} =123\.45\.67\.[8-9]
+RewriteRule ^/secret/files/ - [F]
+</highlight>
</dd>
<dt>Discussion :</dt>
Vous pouvez cependant parvenir au même résultat sans utiliser
mod_rewrite via la méthode alternative suivante :
</p>
- <example>
- SetEnvIfNoCase User-Agent ^Vilain_Robot interdit<br />
- <Location /secret/fichiers><br />
- Order allow,deny<br />
- Allow from all<br />
- Deny from env=interdit<br />
- </Location>
- </example>
+ <highlight language="config">
+SetEnvIfNoCase User-Agent ^NameOfBadRobot goaway
+<Location /secret/files>
+ <RequireAll>
+ Require all granted
+ Require not env goaway
+ </RequireAll>
+</Location>
+ </highlight>
<p>
Comme indiqué plus haut, il est aisé de contourner cette
technique, simplement en modifiant le contenu de l'en-tête
<dt>Solution :</dt>
<dd>
-<example>
-RewriteEngine on<br />
-RewriteMap hosts-deny txt:/chemin/vers/hosts.deny<br />
-RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND [OR]<br />
-RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND<br />
+<highlight language="config">
+RewriteEngine on
+RewriteMap hosts-deny txt:/path/to/hosts.deny
+RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND [OR]
+RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^ - [F]
-</example>
+</highlight>
<example>
##<br />
<p>Le jeu de règles suivant utilise un fichier de correspondances pour
associer chaque Referer à une cible de redirection.</p>
-<example>
-RewriteMap deflector txt:/chemin/vers/deflector.map<br />
-<br />
-RewriteCond %{HTTP_REFERER} !=""<br />
-RewriteCond ${deflector:%{HTTP_REFERER}} =-<br />
-RewriteRule ^ %{HTTP_REFERER} [R,L]<br />
-<br />
-RewriteCond %{HTTP_REFERER} !=""<br />
-RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} !=NOT-FOUND<br />
+<highlight language="config">
+RewriteMap deflector txt:/path/to/deflector.map
+
+RewriteCond %{HTTP_REFERER} !=""
+RewriteCond ${deflector:%{HTTP_REFERER}} =-
+RewriteRule ^ %{HTTP_REFERER} [R,L]
+
+RewriteCond %{HTTP_REFERER} !=""
+RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^ ${deflector:%{HTTP_REFERER}} [R,L]
-</example>
+</highlight>
<p>Le fichier de correspondances contient les cibles de
redirection associées à chaque Referer, ou, si nous voulons
simplement rediriger les requêtes vers leur Referer, un "-" est
inscrit dans le fichier de correspondances :</p>
-<example>
+<highlight language="config">
##<br />
## deflector.map<br />
##<br />
http://www.mauvais-gars.example.com/mauvais/index.html -<br />
http://www.mauvais-gars.example.com/mauvais/index2.html -<br />
http://www.mauvais-gars.example.com/mauvais/index3.html http://quelque-part.example.com/
-</example>
+</highlight>
</dd>
</dl>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
-<!-- English Revision: 1174747:1338147 (outdated) -->
+<!-- English Revision: 1338147 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
<manualpage metafile="avoid.xml.meta">
<parentdocument href="./">Rewrite</parentdocument>
-<title>Techniques avancées de réécriture avec mod_rewrite</title>
+<title>Advanced Techniques with mod_rewrite</title>
<summary>
serveur par défaut qui sera utilisé lorsqu'un utilisateur ne
possèdera pas d'entrée dans la table de correspondances :</p>
-<example>
-RewriteEngine on<br />
-<br />
-RewriteMap utilisateurs-serveurs
-txt:/chemin/vers/correspondances-utilisateurs-serveurs<br />
-<br />
-RewriteRule ^/u/<strong>([^/]+)</strong>/?(.*) http://<strong>${utilisateurs-serveurs:$1|server0}</strong>/u/$1/$2
-</example>
+<highlight language="config">
+RewriteEngine on
+RewriteMap users-to-hosts txt:/path/to/map.users-to-hosts
+RewriteRule ^/u/([^/]+)/?(.*) http://${users-to-hosts:$1|server0}/u/$1/$2
+</highlight>
</dd>
</dl>
<dt>Solution :</dt>
<dd>
- À cet effet, on utilise le jeu de règles suivant :
+ A cet effet, on utilise le jeu de règles suivant :
-<example>
-# Cet exemple n'est valable que dans un contexte de répertoire<br />
-RewriteCond %{REQUEST_URI} <strong>!-U</strong><br />
+<highlight language="config">
+# Cet exemple n'est valable que dans un contexte de répertoire
+RewriteCond %{REQUEST_URI} !-U
RewriteRule ^(.+)\.html$ /regenerate_page.cgi [PT,L]
-</example>
+</highlight>
<p>L'opérateur <code>-U</code> permet de déterminer si la chaîne
de test (dans ce cas <code>REQUEST_URI</code>) est une URL valide.
module="mod_rewrite">RewriteMap</directive> et une liste de
serveurs.</p>
-<example>
-RewriteEngine on<br />
-RewriteMap lb rnd:/chemin/vers/liste-serveurs.txt<br />
-<br />
+<highlight language="config">
+RewriteEngine on
+RewriteMap lb rnd:/path/to/serverlist.txt
RewriteRule ^/(.*) http://${lb:serveurs}/$1 [P,L]
-</example>
+</highlight>
<p><code>liste-serveurs.txt</code> contiendra la liste des serveurs :</p>
actualisée chaque fois que la ressource est mise à jour dans
le système de fichiers.</p>
-<example>
+<highlight language="config">
RewriteRule ^(/[uge]/[^/]+/?.*):refresh /interne/cgi/apache/nph-refresh?f=$
-</example>
+</highlight>
<p>Nous appelons maintenant cette URL</p>
écrive habituellement dans ces cas "laissé à la charge du
lecteur à titre d'exercice", ;-) je vous l'offre, aussi.</p>
-<example><pre>
+<highlight language="perl">
#!/sw/bin/perl
##
## nph-refresh -- script NPH/CGI pour l'actualisation automatique de
$| = 1;
# éclate la variable QUERY_STRING
-@pairs = split(/&/, $ENV{'QUERY_STRING'});
+@pairs = split( /&/, $ENV{'QUERY_STRING'} );
foreach $pair (@pairs) {
-($name, $value) = split(/=/, $pair);
-$name =~ tr/A-Z/a-z/;
-$name = 'QS_' . $name;
-$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
-eval "\$$name = \"$value\"";
+ ( $name, $value ) = split( /=/, $pair );
+ $name =~ tr/A-Z/a-z/;
+ $name = 'QS_' . $name;
+ $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
+ eval "\$$name = \"$value\"";
}
-$QS_s = 1 if ($QS_s eq '');
-$QS_n = 3600 if ($QS_n eq '');
-if ($QS_f eq '') {
-print "HTTP/1.0 200 OK\n";
-print "Content-type: text/html\n\n";
-print "&lt;b&gt;ERREUR&lt;/b&gt;: Aucun fichier fourni\n";
-exit(0);
+$QS_s = 1 if ( $QS_s eq '' );
+$QS_n = 3600 if ( $QS_n eq '' );
+if ( $QS_f eq '' ) {
+ print "HTTP/1.0 200 OK\n";
+ print "Content-type: text/html\n\n";
+ print "<b>ERROR</b>: No file given\n";
+ exit(0);
}
-if (! -f $QS_f) {
-print "HTTP/1.0 200 OK\n";
-print "Content-type: text/html\n\n";
-print "&lt;b&gt;ERREUR&lt;/b&gt;: Fichier $QS_f non trouvé\n";
-exit(0);
+if ( !-f $QS_f ) {
+ print "HTTP/1.0 200 OK\n";
+ print "Content-type: text/html\n\n";
+ print "<b>ERROR</b>: File $QS_f not found\n";
+ exit(0);
}
sub print_http_headers_multipart_begin {
-print "HTTP/1.0 200 OK\n";
-$bound = "ThisRandomString12345";
-print "Content-type: multipart/x-mixed-replace;boundary=$bound\n";
-&print_http_headers_multipart_next;
+ print "HTTP/1.0 200 OK\n";
+ $bound = "ThisRandomString12345";
+ print "Content-type: multipart/x-mixed-replace;boundary=$bound\n";
+ &print_http_headers_multipart_next;
}
sub print_http_headers_multipart_next {
-print "\n--$bound\n";
+ print "\n--$bound\n";
}
sub print_http_headers_multipart_end {
-print "\n--$bound--\n";
+ print "\n--$bound--\n";
}
sub displayhtml {
-local($buffer) = @_;
-$len = length($buffer);
-print "Content-type: text/html\n";
-print "Content-length: $len\n\n";
-print $buffer;
+ local ($buffer) = @_;
+ $len = length($buffer);
+ print "Content-type: text/html\n";
+ print "Content-length: $len\n\n";
+ print $buffer;
}
sub readfile {
-local($file) = @_;
-local(*FP, $size, $buffer, $bytes);
-($x, $x, $x, $x, $x, $x, $x, $size) = stat($file);
-$size = sprintf("%d", $size);
-open(FP, "&lt;$file");
-$bytes = sysread(FP, $buffer, $size);
-close(FP);
-return $buffer;
+ local ($file) = @_;
+ local ( *FP, $size, $buffer, $bytes );
+ ( $x, $x, $x, $x, $x, $x, $x, $size ) = stat($file);
+ $size = sprintf( "%d", $size );
+ open( FP, "<$file" );
+ $bytes = sysread( FP, $buffer, $size );
+ close(FP);
+ return $buffer;
}
$buffer = &readfile($QS_f);
&displayhtml($buffer);
sub mystat {
-local($file) = $_[0];
-local($time);
+ local ($file) = $_[0];
+ local ($time);
-($x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime) = stat($file);
-return $mtime;
+ ( $x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime ) = stat($file);
+ return $mtime;
}
$mtimeL = &mystat($QS_f);
-$mtime = $mtime;
-for ($n = 0; $n &lt; $QS_n; $n++) {
-while (1) {
- $mtime = &mystat($QS_f);
- if ($mtime ne $mtimeL) {
- $mtimeL = $mtime;
- sleep(2);
- $buffer = &readfile($QS_f);
- &print_http_headers_multipart_next;
- &displayhtml($buffer);
- sleep(5);
- $mtimeL = &mystat($QS_f);
- last;
+$mtime = $mtime;
+for ( $n = 0 ; $n & lt ; $QS_n ; $n++ ) {
+ while (1) {
+ $mtime = &mystat($QS_f);
+ if ( $mtime ne $mtimeL ) {
+ $mtimeL = $mtime;
+ sleep(2);
+ $buffer = &readfile($QS_f);
+ &print_http_headers_multipart_next;
+ &displayhtml($buffer);
+ sleep(5);
+ $mtimeL = &mystat($QS_f);
+ last;
+ }
+ sleep($QS_s);
}
- sleep($QS_s);
-}
}
&print_http_headers_multipart_end;
exit(0);
##EOF##
-</pre></example>
+</highlight>
</dd>
</dl>
<p>On utilise le jeu de règles suivant pour développer les
URLs avec tilde selon l'organisation structurée précédente.</p>
-<example>
-RewriteEngine on<br />
+<highlight language="config">
+RewriteEngine on
RewriteRule ^/~(<strong>([a-z])</strong>[a-z0-9]+)(.*) /home/<strong>$2</strong>/$1/public_html$3
-</example>
+</highlight>
</dd>
</dl>
permettent d'effectuer des redirections dépendant de
l'heure :</p>
-<example>
-RewriteEngine on<br />
-RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700<br />
-RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900<br />
-RewriteRule ^foo\.html$ foo.jour.html [L]<br />
-RewriteRule ^foo\.html$ foo.nuit.html
-</example>
+<highlight language="config">
++RewriteEngine on
++RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700
++RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900
++RewriteRule ^foo\.html$ foo.day.html [L]
+</highlight>
<p>Avec cet exemple, l'URL <code>foo.html</code> renvoie
le contenu de <code>foo.jour.html</code> durant le
la fenêtre de temps configurée. On peut utiliser
<module>mod_expires</module> pour contourner ce problème. Il est
cependant bien plus commode de servir un contenu dynamique, et
- de le personnaliser en fonction de l'heure du jour.</note> </dd>
+ de le personnaliser en fonction de l'heure du jour.</note>
+ </dd>
</dl>
</section>
<p>Utiliser le drapeau [E] pour définir une variable
d'environnement.</p>
-<example>
-RewriteEngine on<br />
+<highlight language="config">
+RewriteEngine on
RewriteRule ^/cheval/(.*) /poney/$1 [E=<strong>rewritten:1</strong>]
-</example>
+</highlight>
<p>Plus loin dans votre jeu de règles, vous pouvez vérifier le
contenu de cette variable d'environnement via une directive
RewriteCond :</p>
-<example>
+<highlight language="config">
RewriteCond %{ENV:rewritten} =1
-</example>
+</highlight>
</dd>
</dl>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
-<!-- English Revision: 1328305:1333985 (outdated) -->
+<!-- English Revision : 1333985 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
<p>Pour rediriger les URLs sous <code>/un</code> vers
<code>http://un.example.com/</code>, utilisez cette définition :</p>
-<example>
-Redirect /un/ http://un.example.com/
-</example>
+<highlight language="config">Redirect /one/ http://one.example.com/</highlight>
<p>Pour rediriger les URLs <code>http</code> vers <code>https</code>,
utilisez cette définition :</p>
-<example>
+<highlight language="config">
<VirtualHost *:80>
-ServerName www.example.com<br />
-Redirect / https://www.example.com/<br />
+ServerName www.example.com
+Redirect / https://www.example.com/
</VirtualHost >
-<br />
+
<VirtualHost *:443>
-ServerName www.example.com<br />
-<br />
-# ... insérer ici la configuration SSL<br />
+ServerName www.example.com
+# ... insérer ici la configuration SSL
</VirtualHost >
-</example>
+</highlight>
<p>L'utilisation de la directive <code>RewriteRule</code> pour accomplir
cette tâche peut se justifier s'il existe d'autres directives
<code>Alias</code> pour des raisons de simplicité et de performances.</p>
<example><title>Utilisation de la directive Alias</title>
-Alias /chats /var/www/virtualhosts/felin/htdocs
+<highlight language="config">Alias /cats
+/var/www/virtualhosts/felines/htdocs</highlight>
</example>
<p>
<p>L'utilisation de <module>mod_rewrite</module> pour la création de
serveurs virtuels peut se révéler appropriée si votre service
d'hébergement ne vous permet pas d'accéder aux fichiers de configuration
-du serveur, et que vous vous trouvez par conséquent obligé de passer par les
+du serveur, et que vous soyez par conséquent obligé de passer par les
fichiers <code>.htaccess</code>.</p>
<p>Voir le document <a href="vhosts.html">création de serveurs virtuels
href="flags.html#flag_p">[P]</a> qui permet de faire passer les URIs
réécrits par <module>mod_proxy</module>.</p>
-<example>
+<highlight language="config">
RewriteRule ^/?images(.*) http://serveur-images.local/images$1 [P]
-</example>
+</highlight>
<p>Cependant, dans les nombreux cas où aucune correspondance au modèle
n'est vraiment nécessaire, comme dans l'exemple ci-dessus, il est
module="mod_proxy">ProxyPass</directive>. L'exemple précédent pourrait
être remplacé par :</p>
-<example>
+<highlight language="config">
ProxyPass /images/ http://serveur-images.local/images/
-</example>
+</highlight>
<p>Que vous utilisiez <directive
module="mod_rewrite">RewriteRule</directive> ou <directive
module="mod_proxy">ProxyPassReverse</directive> pour intercepter les
redirections en provenance du serveur d'arrière-plan :</p>
-<example>
+<highlight language="config">
ProxyPassReverse /images/ http://serveur-images.local/images/
-</example>
+</highlight>
<p>Vous devrez cependant tout de même utiliser <code>RewriteRule</code>
lorsque d'autres <code>RewriteRule</code>s se trouvent dans la même portée,
directive <directive module="core" type="section">If</directive> comme
suit :</p>
-<example>
-<If "$req{Host} != 'www.example.com'"><br />
-RedirectMatch (.*) http://www.example.com$1<br />
+<highlight language="config">
+<If "req('Host') != 'www.example.com'">
+ Redirect / http://www.example.com
</If>
-</example>
+</highlight>
-<p>On peut utiliser cette technique dans de nombreux scénarios courants
-en remplacement de <module>mod_rewrite</module> pour effectuer des actions
+<p>On peut utiliser cette technique dans de nombreux scénarios courant
+pour remplacer <module>mod_rewrite</module> pour effectuer des actions
en fonction d'en-têtes de requêtes ou de réponses, ou de variables
d'environnement.</p>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
-<!-- English Revision: 1311806:1333985 (outdated) -->
+<!-- English Revision : 1333985 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
module="mod_rewrite">RewriteRule</directive> peut être modifié par un ou
plusieurs drapeaux. Les drapeaux sont situés en fin de règle, entourés
de crochets, et séparés le cas échéant par des virgules.</p>
-<example>
-RewriteRule modèle cible [drapeau1,drapeau2,drapeau3]
-</example>
+<highlight language="config">RewriteRule pattern target [Flag1,Flag2,Flag3]</highlight>
<p>Les drapeaux ont tous une forme courte, comme <code>CO</code>, ainsi
qu'une forme longue, comme <code>cookie</code>. Certains drapeaux
non-alphanumériques des références arrières seront échappés. Considérons
par exemple cette règle :</p>
-<example>
-RewriteRule ^search/(.*)$ /search.php?term=$1
-</example>
+<highlight language="config">RewriteRule ^search/(.*)$ /search.php?term=$1</highlight>
<p>Soit le terme de recherche 'x & y/z' ; un navigateur va le coder
en 'x%20%26%20y%2Fz', transformant la requête en
<p>Voici un exemple :</p>
-<example>
-RewriteEngine On<br />
+<highlight language="config">
+RewriteEngine On
RewriteRule ^/index\.html - [CO=frontdoor:yes:.example.org:1440:/]
-</example>
+</highlight>
<p>Dans l'exemple ci-dessus, la règle ne réécrit
pas la requête. La cible de réécriture "-"
<p>La règle suivante va interdire la téléchargement de fichiers
<code>.exe</code> depuis votre serveur.</p>
-<example>
-RewriteRule \.exe - [F]
-</example>
+<highlight language="config">RewriteRule \.exe - [F]</highlight>
<p>Cet exemple utilise la syntaxe "-" pour la cible de réécriture, ce
qui signifie que l'URI de la requête n'est pas modifié. Il n'y a aucune
<p>Comme dans le cas du drapeau [F], on utilise en général la syntaxe
"-" pour la cible de réécriture lorsqu'on utilise le drapeau [G] :</p>
-<example>
-RewriteRule ancienne-ressource - [G,NC]
-</example>
+<highlight language="config">RewriteRule oldproduct - [G,NC]</highlight>
<p>Lorsqu'on utilise [G], [L] est implicite - c'est à dire que la
réponse est renvoyée immédiatement, et aucune autre règle n'est évaluée.</p>
l'interprétation de tous les fichiers sans extension par le gestionnaire
php :</p>
-<example>
-RewriteRule !\. - [H=application/x-httpd-php]
-</example>
+<highlight language="config">RewriteRule !\. -
+[H=application/x-httpd-php]</highlight>
<p>
L'expression rationnelle ci-dessus - <code>!\.</code> - correspond à
<em>affichés</em> par <code>mod_php</code> dans le cas où ils font
l'objet d'une requête avec l'extension <code>.phps</code> :</p>
-<example>
+<highlight language="config">
RewriteRule ^(/source/.+\.php)s$ $1 [H=application/x-httpd-php-source]
-</example>
+</highlight>
<p>L'expression rationnelle ci-dessus -
la requête concerne déjà <code>index.php</code>, la directive <directive
module="mod_rewrite">RewriteRule</directive> sera sautée.</p>
-<example>
-RewriteBase /<br />
-RewriteCond %{REQUEST_URI} !=/index.php<br />
+<highlight language="config">
+RewriteBase /
+RewriteCond %{REQUEST_URI} !=/index.php
RewriteRule ^(.*) /index.php?req=$1 [L,PT]
-</example>
+</highlight>
</section>
<section id="flag_n"><title>N|next</title>
ceci jusqu'il n'y ait plus de A à remplacer.
</p>
-<example>
-RewriteRule (.*)A(.*) $1B$2 [N]
-</example>
+<highlight language="config">RewriteRule (.*)A(.*) $1B$2 [N]</highlight>
<p>Vous pouvez vous représenter ce traitement comme une boucle
<code>while</code> : tant que le modèle de la règle correspond (c'est à
insensible à la casse, si bien que par exemple, <code>.jpg</code> aussi
bien que <code>.JPG</code> seront acceptés.</p>
-<example>
-RewriteRule (.*\.(jpg|gif|png))$ http://images.example.com$1 [P,NC]
-</example>
+<highlight language="config">RewriteRule (.*\.(jpg|gif|png))$ http://images.example.com$1 [P,NC]</highlight>
</section>
<section id="flag_ne"><title>NE|noescape</title>
hexadécimal. Le drapeau [NE] permet d'éviter cette conversion.
</p>
-<example>
-RewriteRule ^/ancre/(.+) /grosse-page.html#$1 [NE,R]
-</example>
+<highlight language="config">RewriteRule ^/anchor/(.+) /bigpage.html#$1 [NE,R]</highlight>
<p>
Dans l'exemple ci-dessus, <code>/anchor/xyz</code> est réécrit en
soient traitées par un serveur d'images annexe, vous pouvez utiliser
une règle de ce style :</p>
-<example>
-RewriteRule /(.*)\.(jpg|gif|png) http://images.example.com/$1.$2 [P]
-</example>
+<highlight language="config">RewriteRule /(.*)\.(jpg|gif|png)$ http://images.example.com/$1.$2 [P]</highlight>
<p>L'utilisation du drapeau [P] provoque aussi l'effet du drapeau [L] -
autrement dit, la requête est immédiatement envoyée au mandataire, et
module="mod_alias">Alias</directive> sera bien évalué.
</p>
-<example>
-Alias /icons /usr/local/apache/icons<br />
-RewriteRule /pics/(.+)\.jpg /icons/$1.gif [PT]
-</example>
+<highlight language="config">
+Alias /icons /usr/local/apache/icons
+RewriteRule /pics/(.+)\.jpg$ /icons/$1.gif [PT]
+</highlight>
<p>
Dans l'exemple précédent, en l'absence du drapeau [PT], l'Alias aurait
<p>Considérons la règle suivante :</p>
-<example>
-RewriteRule /pages/(.+) /page.php?page=$1 [QSA]
-</example>
+<highlight language="config">RewriteRule /pages/(.+) /page.php?page=$1
+[QSA]</highlight>
<p>Avec le drapeau [QSA], une requête pour
<code>/pages/123?one=two</code> sera réécrite en
l'exemple suivant, nous ne voulons exécuter la règle <directive
module="mod_rewrite">RewriteRule</directive> que si l'URI demandé ne
correspond pas à un fichier existant.</p>
-
-<example>
-# La requête concerne-t-elle un fichier qui n'existe pas ?<br />
-RewriteCond %{REQUEST_FILENAME} !-f<br />
-RewriteCond %{REQUEST_FILENAME} !-d<br />
-# Si c'est la cas, on saute les deux règles de réécriture suivantes<br />
-RewriteRule .? - [S=2]<br />
-<br />
-RewriteRule (.*\.gif) images.php?$1<br />
+<highlight language="config">
+# La requête concerne-t-elle un fichier qui n'existe pas ?
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteCond %{REQUEST_FILENAME} !-d
+# Si c'est la cas, on saute les deux règles de réécriture suivantes
+RewriteRule .? - [S=2]
+
+RewriteRule (.*\.gif) images.php?$1
RewriteRule (.*\.html) docs.php?$1
-</example>
+</highlight>
+
+
<p>Cette technique trouve son utilité dans le fait qu'une directive
<directive module="mod_rewrite">RewriteCond</directive> ne s'applique
d'élaborer des pseudo-constructions if-then-else : la dernière règle du
bloc then contiendra <code>skip=N</code>, où N est le nombre de règles
contenues dans le bloc else :</p>
-<example>
-# Est-ce que le fichier existe ?<br />
-RewriteCond %{REQUEST_FILENAME} !-f<br />
-RewriteCond %{REQUEST_FILENAME} !-d<br />
-<!-- A traduire pour qui y comprend quelquechose -->
-# Create an if-then-else construct by skipping 3 lines if we meant to go to the "else" stanza.<br />
-RewriteRule .? - [S=3]<br />
-<br />
+<highlight language="config">
+# Est-ce que le fichier existe ?
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteCond %{REQUEST_FILENAME} !-d
+# Create an if-then-else construct by skipping 3 lines if we meant to go to the "else" stanza.
+RewriteRule .? - [S=3]
+
# Si le fichier existe, alors :
-<indent>
- RewriteRule (.*\.gif) images.php?$1<br />
- RewriteRule (.*\.html) docs.php?$1<br />
- # Skip past the "else" stanza.<br />
- RewriteRule .? - [S=1]<br />
-</indent>
+RewriteRule (.*\.gif) images.php?$1
+ RewriteRule (.*\.html) docs.php?$1
+ # Skip past the "else" stanza.
+ RewriteRule .? - [S=1]
# ELSE...
-<indent>
- RewriteRule (.*) 404.php?file=$1<br />
-</indent>
+RewriteRule (.*) 404.php?file=$1
# END
-</example>
+</highlight>
<p>Il est probablement plus aisé de définir ce genre de configuration
via les directives <directive type="section">If</directive>, <directive
du code source Perl en tant que plein texte, s'il est requis d'une
certaine manière :</p>
-<example>
-# Sert les fichier .pl en tant que plein texte<br />
+<highlight language="config">
+# Sert les fichier .pl en tant que plein texte
RewriteRule \.pl$ - [T=text/plain]
-</example>
+</highlight>
<p>Ou encore, si vous possédez une caméra qui produit des fichiers
images jpeg sans extension, vous pouvez forcer le renvoi de ces images
avec le type MIME correct en se basant sur le nom du fichier :</p>
-<example>
-# Les fichiers dont le nom contient 'IMG' sont des images jpg.<br />
+<highlight language="config">
+# Les fichiers dont le nom contient 'IMG' sont des images jpg.
RewriteRule IMG - [T=image/jpg]
-</example>
+</highlight>
<p>Notez cependant qu'il s'agit d'un exemple trivial, et que le problème
aurait pu être résolu en utilisant à la place la directive <directive
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
-<!-- English Revision: 1325683:1333985 (outdated) -->
+<!-- English Revision : 1333985 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
<li><var>[drapeaux]</var>: options affectant la requête réécrite.</li>
</ol>
-<p>Le <var>Modèle</var> est toujours une <a href="#regex">expression
-rationnelle</a> comparée au chemin de l'URL de la requête entrante (la
+<p>Le <var>Modèle</var> est une <a href="#regex">expression
+rationnelle</a>. Au sein de la première règle de réécriture, ou jusqu'à
+ce qu'une substitution survienne, elle est comparée au chemin de
+l'URL de la requête entrante (la
partie située après le nom d'hôte mais avant tout point d'interrogation
qui indique le début d'une chaîne de paramètres de
requête) ou, dans un contexte de répertoire, au chemin de la
-requête relativement au répertoire pour lequel la règle est définie..</p>
+requête relativement au répertoire pour lequel la
+règle est définie. Lorsqu'une substitution a eu lieu, les
+règles suivantes effectuent leurs comparaisons par rapport à la valeur
+substituée.</p>
<p class="figure">
<img src="../images/syntax_rewriterule.png"
<dl>
<dt>Un chemin complet du système de fichiers vers une ressource</dt>
<dd>
-<example>
+<highlight language="config">
RewriteRule ^/jeux /usr/local/jeux/web
-</example>
+</highlight>
<p>Ceci peut faire correspondre une requête à toute localisation voulue de
votre système de fichiers, un peu comme la directive <directive
module="mod_alias">Alias</directive>.</p>
<dt>Un chemin web vers une ressource</dt>
<dd>
-<example>
+<highlight language="config">
RewriteRule ^/foo$ /bar
-</example>
+</highlight>
<p>Si la directive <directive module="core">DocumentRoot</directive> a
pour valeur <code>/usr/local/apache2/htdocs</code>, cette règle va faire
correspondre les requêtes pour <code>http://example.com/foo</code> au
<dt>Une URL absolue</dt>
<dd>
-<example>
+<highlight language="config">
RewriteRule ^/produits/vues$ http://site2.example.com/voirproduits.html [R]
-</example>
+</highlight>
<p>Ceci informe le client qu'il doit effectuer une nouvelle requête vers
l'URL spécifiée.</p>
</dd>
<p>La chaîne de <var>Substitution</var> peut aussi contenir des
<em>références arrières</em> vers des parties du chemin d'URL entrant
correspondant au <var>Modèle</var>. Considérons ce qui suit :</p>
-<example>
+<highlight language="config">
RewriteRule ^/produits/(.*)/view$ /var/web/produitsdb/$1
-</example>
+</highlight>
<p>La variable <code>$1</code> sera remplacée par tout texte
correspondant à l'expression située entre les parenthèses dans le
<var>Modèle</var>. Par exemple, une requête pour
conditions de correspondance d'une règle peuvent être rendues
insensibles à la casse par la présence du drapeau <code>[NC]</code> :
</p>
-<example>
+<highlight language="config">
RewriteRule ^puppy.html petitchien.html [NC]
-</example>
+</highlight>
<p>Pour une liste des drapeaux disponibles, leurs significations, et des
exemples, voir le document <a href="flags.html">Drapeaux de
<p>Par exemple, pour renvoyer toutes les requêtes en provenance d'une
certaine tranche d'adresses IP vers un autre serveur, vous pouvez
utiliser :</p>
-<example>
-RewriteCond %{REMOTE_ADDR} ^10\.2\.<br />
+<highlight language="config">
+RewriteCond %{REMOTE_ADDR} ^10\.2\.
RewriteRule (.*) http://intranet.example.com$1
-</example>
+</highlight>
<p>Si vous spécifiez plus d'une directive <directive
module="mod_rewrite">RewriteCond</directive>, ces directives
pour interdire les requêtes qui contiennent le mot "hack" dans la chaîne
de requête, sauf si elles contiennent aussi un cookie contenant le mot
"go", vous pouvez utiliser :</p>
-<example>
-RewriteCond %{QUERY_STRING} hack<br />
-RewriteCond %{HTTP_COOKIE} !go<br />
+<highlight language="config">
+RewriteCond %{QUERY_STRING} hack
+RewriteCond %{HTTP_COOKIE} !go
RewriteRule . - [F]
-</example>
+</highlight>
<p>Notez que le point d'exclamation indique une correspondance négative
; ainsi, la règle n'est appliquée que si le cookie ne contient pas "go"</p>
les variables <code>%1</code>, <code>%2</code>, etc... Par
exemple, ce qui suit va diriger la requête vers un répertoire différent
en fonction du nom d'hôte utilisé pour accéder au site :</p>
-<example>
-RewriteCond %{HTTP_HOST} (.*)<br />
+<highlight language="config">
+RewriteCond %{HTTP_HOST} (.*)
RewriteRule ^/(.*) /sites/%1/$1
-</example>
+</highlight>
<p>Si la requête concernait <code>http://example.com/foo/bar</code>,
alors <code>%1</code> contiendrait <code>example.com</code> et
<code>$1</code> contiendrait <code>foo/bar</code>.</p>
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
-<!-- English Revision: 1328589:1333999 (outdated) -->
+<!-- English revision : 1333999 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
hyperliens pleinement qualifiés (car vous devez modifier le schéma de l'URL).
Cependant, à l'aide du module <module>mod_rewrite</module>, vous pouvez
manipuler des hyperliens relatifs, pour obtenir le même effet.</p>
- <example>
- RewriteEngine on<br />
- RewriteRule ^/(.*)_SSL$ https://%{SERVER_NAME}/$1 [R,L]<br />
- RewriteRule ^/(.*)_NOSSL$ http://%{SERVER_NAME}/$1 [R,L]
- </example>
+ <highlight language="config">
+RewriteEngine on
+RewriteRule ^/(.*)_SSL$ https://%{SERVER_NAME}/$1 [R,L]
+RewriteRule ^/(.*)_NOSSL$ http://%{SERVER_NAME}/$1 [R,L]
+ </highlight>
<p>Ce jeu de règles rewrite vous permet d'utiliser des hyperliens de la
forme <code><a href="document.html_SSL"></code> pour passer en HTTPS
-keyout server.key</strong></code><br />
Ces fichiers seront utilisés comme suit dans votre
<code>httpd.conf</code> :
- <pre>
- SSLCertificateFile /chemin/vers/server.crt
- SSLCertificateKeyFile /chemin/vers/server.key
- </pre>
+ <highlight language="config">
+SSLCertificateFile /path/to/this/server.crt
+SSLCertificateKeyFile /path/to/this/server.key
+ </highlight>
</li>
<li>Il est important de savoir que le fichier <code>server.key</code> n'a
<em>pas</em> de mot de passe. Pour ajouter un mot de passe à la clé, vous
<li>Vous devez maintenant disposer de deux fichiers :
<code>server.key</code> et <code>server.crt</code>. Ils sont précisés dans
votre fichier <code>httpd.conf</code> comme suit :
- <pre>
- SSLCertificateFile /chemin/vers/server.crt
- SSLCertificateKeyFile /chemin vers/server.key
- </pre>
+ <highlight language="config">
+SSLCertificateFile /path/to/this/server.crt
+SSLCertificateKeyFile /path/to/this/server.key
+ </highlight>
Le fichier <code>server.csr</code> n'est plus nécessaire.
</li>
(sur le port 443). Mais dans ce cas, vous devez définir le numéro de port
non-SSL à l'aide de la directive NameVirtualHost dans ce style :</p>
- <example>
+ <highlight language="config">
NameVirtualHost 192.168.1.1:80
- </example>
+ </highlight>
<p>il existe d'autres solutions alternatives comme :</p>
ou l'envoi de messages de notification de fermeture de session SSL aux
clients MSIE. Pour cela, vous pouvez utiliser la directive suivante
dans votre section d'hôte virtuel avec support SSL :</p>
- <example>
- SetEnvIf User-Agent "MSIE [2-5]" \<br />
- nokeepalive ssl-unclean-shutdown \<br />
- downgrade-1.0 force-response-1.0
- </example>
+ <highlight language="config">
+SetEnvIf User-Agent "MSIE [2-5]" \
+ nokeepalive ssl-unclean-shutdown \
+ downgrade-1.0 force-response-1.0
+ </highlight>
<p>En outre, certaines versions de MSIE ont des problèmes avec des
algorithmes de chiffrement particuliers. Hélas, il n'est pas
possible d'apporter une solution spécifique à MSIE pour ces
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE manualpage SYSTEM "../style/manualpage.dtd">
<?xml-stylesheet type="text/xsl" href="../style/manual.fr.xsl"?>
-<!-- English Revision: 1328589:1333999 (outdated) -->
+<!-- English Revision : 1333999 -->
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
<p>Votre configuration SSL doit comporter au moins les directives
suivantes :</p>
-<example>
- Listen 443
- <VirtualHost *:443><br />
- <indent>
- ServerName www.example.com<br />
- SSLEngine on<br />
- SSLCertificateFile /chemin/vers/www.example.com.cert<br />
- SSLCertificateKeyFile /chemin/vers/www.example.com.key<br />
- </indent>
- </VirtualHost>
-</example>
+<highlight language="config">
+Listen 443
+<VirtualHost *:443>
+ ServerName www.example.com
+ SSLEngine on
+ SSLCertificateFile /path/to/www.example.com.cert
+ SSLCertificateKeyFile /path/to/www.example.com.key
+</VirtualHost>
+</highlight>
</section>
que le chiffrement fort ?</title>
<p>Les directives suivantes ne permettent que les
chiffrements de plus haut niveau :</p>
- <example><title>httpd.conf</title>
- SSLCipherSuite HIGH:!aNULL:!MD5<br />
- </example>
+ <highlight language="config">
+ SSLCipherSuite HIGH:!aNULL:!MD5
+ </highlight>
</section>
rapidité (le choix final sera opéré par mod_ssl, dans la mesure ou le
client les supporte) :</p>
- <example><title>httpd.conf</title>
- SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:!aNULL:!MD5<br />
- SSLHonorCipherOrder on
- </example>
+ <highlight language="config">
+SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:!aNULL:!MD5
+SSLHonorCipherOrder on
+ </highlight>
</section>
<section id="strongurl">
<module>mod_ssl</module> peut alors forcer automatiquement une
renégociation des paramètres SSL pour parvenir au but recherché.
Cette configuration peut se présenter comme suit :</p>
- <example>
- # soyons très tolérant a priori<br />
- SSLCipherSuite ALL:!aNULL:RC4+RSA:+HIGH:+MEDIUM:+LOW:+EXP:+eNULL<br />
- <br />
- <Location /strong/area><br />
- # sauf pour https://hostname/strong/area/ et ses sous-répertoires<br />
- # qui exigent des chiffrements forts<br />
- SSLCipherSuite HIGH:!aNULL:!MD5<br />
- </Location>
- </example>
+ <highlight language="config">
+# soyons très tolérant a priori
+SSLCipherSuite ALL:!aNULL:RC4+RSA:+HIGH:+MEDIUM:+LOW:+EXP:+eNULL
+
+<Location /strong/area>
+# sauf pour https://hostname/strong/area/ et ses sous-répertoires
+# qui exigent des chiffrements forts
+SSLCipherSuite HIGH:!aNULL:!MD5
+</Location>
+ </highlight>
</section>
<!-- /ciphersuites -->
le certificat de votre propre autorité de certification
(<code>ca.crt</code>), et d'authentifier les clients à l'aide de ces
certificats.</p>
- <example><title>httpd.conf</title>
- # exige un certificat client signé par le certificat de votre CA<br />
- # contenu dans ca.crt<br />
- SSLVerifyClient require<br />
- SSLVerifyDepth 1<br />
- SSLCACertificateFile conf/ssl.crt/ca.crt
- </example>
+ <highlight language="config">
+# exige un certificat client signé par le certificat de votre CA
+# contenu dans ca.crt
+SSLVerifyClient require
+SSLVerifyDepth 1
+SSLCACertificateFile conf/ssl.crt/ca.crt
+ </highlight>
</section>
<section id="arbitraryclients">
URL particulière, vous pouvez utiliser les fonctionnalités de reconfiguration
de <module>mod_ssl</module> en fonction du répertoire :</p>
- <example><title>httpd.conf</title>
- SSLVerifyClient none<br />
- SSLCACertificateFile conf/ssl.crt/ca.crt<br />
- <br />
- <Location /secure/area><br />
- SSLVerifyClient require<br />
- SSLVerifyDepth 1<br />
- </Location><br />
- </example>
+ <highlight language="config">
+SSLVerifyClient none
+SSLCACertificateFile conf/ssl.crt/ca.crt
+
+<Location /secure/area>
+SSLVerifyClient require
+SSLVerifyDepth 1
+</Location>
+ </highlight>
</section>
<section id="certauthenticate">
de données de mots de passe contenant <em>tous</em> les clients
autorisés, comme suit :</p>
- <example><title>httpd.conf</title><pre>
+ <highlight language="config">
SSLVerifyClient none
<Directory /usr/local/apache2/htdocs/secure/area>
-
SSLVerifyClient require
-SSLVerifyDepth 5
-SSLCACertificateFile conf/ssl.crt/ca.crt
-SSLCACertificatePath conf/ssl.crt
-SSLOptions +FakeBasicAuth
-SSLRequireSSL
-AuthName "Snake Oil Authentication"
-AuthType Basic
-AuthBasicProvider file
-AuthUserFile /usr/local/apache2/conf/httpd.passwd
-Require valid-user
-</Directory></pre>
- </example>
+ SSLVerifyDepth 5
+ SSLCACertificateFile conf/ssl.crt/ca.crt
+ SSLCACertificatePath conf/ssl.crt
+ SSLOptions +FakeBasicAuth
+ SSLRequireSSL
+ AuthName "Snake Oil Authentication"
+ AuthType Basic
+ AuthBasicProvider file
+ AuthUserFile /usr/local/apache2/conf/httpd.passwd
+ Require valid-user
+</Directory>
+ </highlight>
+
<p>Le mot de passe utilisé dans cet exemple correspond à la chaîne de
caractères "password" chiffrée en DES. Voir la documentation de la
>SSLRequire</directive>, comme suit :</p>
- <example><title>httpd.conf</title><pre>
+ <highlight language="config">
SSLVerifyClient none
<Directory /usr/local/apache2/htdocs/secure/area>
-
SSLVerifyClient require
SSLVerifyDepth 5
SSLCACertificateFile conf/ssl.crt/ca.crt
SSLRequireSSL
SSLRequire %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"}
-</Directory></pre>
- </example>
+</Directory>
+ </highlight>
</section>
<section id="intranet">
doivent se trouver en dehors de votre hôte virtuel HTTPS, afin qu'elles
s'appliquent à la fois à HTTP et HTTPS.</p>
- <example><title>httpd.conf</title><pre>
+ <highlight language="config">
SSLCACertificateFile conf/ssl.crt/company-ca.crt
<Directory /usr/local/apache2/htdocs>
-# En dehors de subarea, seul l'accès depuis l'intranet est autorisé
-Order deny,allow
-Deny from all
-Allow from 192.168.1.0/24
+# En dehors de subarea, seul l'accès depuis l'intranet est
+# autorisé
+ Order deny,allow
+ Deny from all
+ Allow from 192.168.1.0/24
</Directory>
<Directory /usr/local/apache2/htdocs/subarea>
# Dans subarea, tout accès depuis l'intranet est autorisé
-# mais depuis l'Internet, seul l'accès par HTTPS + chiffrement fort
- + Mot de passe
+# mais depuis l'Internet, seul l'accès par HTTPS + chiffrement fort + Mot de passe
# ou HTTPS + chiffrement fort + certificat client n'est autorisé.
# Si HTTPS est utilisé, on s'assure que le niveau de chiffrement est fort.
# Autorise en plus les certificats clients comme une alternative à
# l'authentification basique.
-SSLVerifyClient optional
-SSLVerifyDepth 1
-SSLOptions +FakeBasicAuth +StrictRequire
-SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128
-
-# ON oblige les clients venant d'Internet à utiliser HTTPS
-RewriteEngine on
-RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+$
-RewriteCond %{HTTPS} !=on
-RewriteRule . - [F]
-
-# On permet l'accès soit sur les critères réseaux, soit par authentification Basique
-Satisfy any
-
-# Contrôle d'accès réseau
-Order deny,allow
-Deny from all
-Allow 192.168.1.0/24
-
-# Configuration de l'authentification HTTP Basique
-AuthType basic
-AuthName "Protected Intranet Area"
-AuthBasicProvider file
-AuthUserFile conf/protected.passwd
-Require valid-user
-</Directory></pre>
- </example>
+ SSLVerifyClient optional
+ SSLVerifyDepth 1
+ SSLOptions +FakeBasicAuth +StrictRequire
+ SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128
+
+ # ON oblige les clients venant d'Internet à utiliser HTTPS
+ RewriteEngine on
+ RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+$
+ RewriteCond %{HTTPS} !=on
+ RewriteRule . - [F]
+
+ # On permet l'accès soit sur les critères réseaux, soit par authentification Basique
+ Satisfy any
+
+ # Contrôle d'accès réseau
+ Order deny,allow
+ Deny from all
+ Allow 192.168.1.0/24
+
+ # Configuration de l'authentification HTTP Basique
+ AuthType basic
+ AuthName "Protected Intranet Area"
+ AuthBasicProvider file
+ AuthUserFile conf/protected.passwd
+ Require valid-user
+</Directory>
+ </highlight>
</section>
</section>
<!-- /access control -->
<?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
-<!-- English Revision: 1038591:1334033 (outdated) -->
+<!-- English Revision: 1334033 -->
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
<p>Si, par exemple, votre serveur web est configuré pour
s'exécuter en tant que :</p>
-<example>
- User www<br />
- Group webgroup<br />
-</example>
+<highlight language="config">
+User www
+Group webgroup
+ </highlight>
<p>et <program>suexec</program> se trouve à
"/usr/local/apache2/bin/suexec", vous devez exécuter les
<?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
-<!-- English Revision: 1304987:1334033 (outdated) -->
+<!-- English Revision : 1334033 -->
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
<li>configure: le jeu de modules "reallyall" ajoute les modules de
développeur au jeu "all".</li>
-
- <li>apr et apr-util: APR et APR-Util ne sont plus fournis dans le
- paquet Apache httpd 2.4. Vous pouvez soit continuer à utiliser les
- versions installées, soit continuer à utiliser l'option du script
- configure <code>--with-included-apr</code> après avoir téléchargés
- les paquets apr/apr-util (depuis <a
- href="http://apr.apache.org/">Apache
- APR</a>), et les avoir décompressés dans <code>./srclib/</code>.</li>
</ul>
</section>
<p>Dans cet exemple, toutes les requêtes sont rejetées :</p>
<example>
<title>version 2.2 :</title>
- Order deny,allow<br />
- Deny from all
+ <highlight language="config">
+Order deny,allow
+Deny from all
+ </highlight>
</example>
<example>
<title>version 2.4 :</title>
+ <highlight language="config">
Require all denied
+ </highlight>
</example>
<p>Dans cet exemple, toutes les requêtes sont acceptées :</p>
<example>
<title>version 2.2 :</title>
- Order allow,deny<br />
- Allow from all
+ <highlight language="config">
+Order allow,deny
+Allow from all
+ </highlight>
</example>
<example>
<title>version 2.4 :</title>
+ <highlight language="config">
Require all granted
+ </highlight>
</example>
<p>Dans l'exemple suivant, tous les hôtes du domaine example.org
<example>
<title>version 2.2 :</title>
- Order Deny,Allow<br />
- Deny from all<br />
- Allow from example.org
+ <highlight language="config">
+Order Deny,Allow
+Deny from all
+Allow from example.org
+ </highlight>
</example>
<example>
<title>version 2.4 :</title>
+ <highlight language="config">
Require host example.org
+ </highlight>
</example>
</section>
<directive module="mod_include">SSILegacyExprParser</directive> a
été activée pour le répertoire contenant les pages d'erreur.
</li>
+
+ <li>La fonctionnalité fournie par <code>mod_authn_alias</code>
+ dans les précédentes versions (en fait la directive
+ <directive module="mod_authn_core">AuthnProviderAlias</directive>)
+ est maintenant fournie par <module>mod_authn_core</module>.
+ </li>
</ul>
</section>
<?xml-stylesheet type="text/xsl" href="./style/manual.fr.xsl"?>
<!-- French translation : Lucien GENTIS -->
<!-- Reviewed by : Vincent Deffontaines -->
-<!-- English Revision: 1310495:1334033 (outdated) -->
+<!-- English Revision: 1334033 -->
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
module="mod_alias">Alias</directive> pour rattacher toute portion
du système de fichiers à l'arborescence du site web. Par exemple, avec</p>
-<example>Alias /docs /var/web</example>
+<highlight language="config">Alias /docs /var/web</highlight>
<p>l'URL <code>http://www.example.com/docs/dir/file.html</code>
correspondra au fichier <code>/var/web/dir/file.html</code>. La
sur les <glossary ref="regex">expressions rationnelles</glossary>.
Par exemple,</p>
-<example>ScriptAliasMatch ^/~([a-zA-Z0-9]+)/cgi-bin/(.+)
- /home/$1/cgi-bin/$2</example>
+<highlight language="config">
+ ScriptAliasMatch ^/~([a-zA-Z0-9]+)/cgi-bin/(.+) /home/$1/cgi-bin/$2
+ </highlight>
<p>fera correspondre une requête du style
<code>http://example.com/~user/cgi-bin/script.cgi</code> au chemin
<code>/home/user/public_html/file.html</code>, utilisez la directive
<code>AliasMatch</code> suivante :</p>
-<example>AliasMatch ^/upages/([a-zA-Z0-9]+)(/(.*))?$
- /home/$1/public_html/$3</example>
+<highlight language="config">
+ AliasMatch ^/upages/([a-zA-Z0-9]+)(/(.*))?$ /home/$1/public_html/$3
+ </highlight>
</section>
<section id="redirect"><title>Redirection d'URL</title>
nouveau répertoire <code>/bar/</code>, vous pouvez demander aux clients
de le requérir à sa nouvelle localisation comme suit :</p>
-<example>Redirect permanent /foo/ http://www.example.com/bar/</example>
+<highlight language="config">
+ Redirect permanent /foo/ http://www.example.com/bar/
+ </highlight>
<p>Ceci aura pour effet de rediriger tout chemin d'URL commençant par
<code>/foo/</code> vers le même chemin d'URL sur le serveur
laisser toutes les autres requêtes inchangées, utilisez la
configuration suivante :</p>
-<example>RedirectMatch permanent ^/$
- http://www.example.com/startpage.html</example>
+<highlight language="config">
+ RedirectMatch permanent ^/$ http://www.example.com/startpage.html
+ </highlight>
<p>De même, pour rediriger temporairement toutes les pages d'un site
vers une page particulière d'un autre site, utilisez ce qui suit :</p>
-<example>RedirectMatch temp .*
- http://othersite.example.com/startpage.html</example>
+<highlight language="config">
+ RedirectMatch temp .* http://othersite.example.com/startpage.html
+ </highlight>
</section>
<section id="proxy"><title>Mandataire inverse (Reverse Proxy)</title>
<code>/bar/</code> sur <code>internal.example.com</code>
et les renvoie au client comme s'ils appartenaient au serveur local.</p>
-<example>
+<highlight language="config">
ProxyPass /foo/ http://internal.example.com/bar/<br />
ProxyPassReverse /foo/ http://internal.example.com/bar/<br />
ProxyPassReverseCookieDomain internal.example.com public.example.com<br />
ProxyPassReverseCookiePath /foo/ /bar/
-</example>
+</highlight>
<p>La directive <directive module="mod_proxy">ProxyPass</directive> configure
le serveur pour rapatrier les documents appropriés, alors que la directive
d'utres contenus) situés dans la page au moment où elle est envoyée au
client en utilisant le module <module>mod_substitute</module>.</p>
-<example>
+<highlight language="config">
Substitute s/internal\.example\.com/www.example.com/i
-</example>
+</highlight>
<p>Le module <module>mod_proxy_html</module> rend possible une réécriture plus
élaborée des liens en HTML et XHTML. Il permet de créer des listes