Ce document est un complément à la documentation de référence du module
Le module Apache
Ce document a pour ambition d'être suffisamment explicite pour permettre la compréhension, et non la copie en aveugle, de ce qui suit.
Gardez à l'esprit que de nombreuses tâches de manipulation d'URLs
courantes n'ont pas besoin de la puissance et de la complexité de
Enfin, avant de procéder, assurez-vous d'avoir configuré le niveau de
journalisation de
mod_rewrite utilise le vocabulaire des Expressions rationnelles compatibles Perl. Ce document n'a pas pour prétention d'être une référence détaillée des expressions rationnelles. A cet effet, nous recommandons les pages de manuel de PCRE, la page de manuel des expressions rationnelles Perl, et l'ouvrage Mastering Regular Expressions, by Jeffrey Friedl.
Dans ce document, nous avons pour but de vous fournir suffisamment de
vocabulaire des expressions rationnelles pour vous mettre le pied à
l'étrier, sans être dépassé, en espérant que les directives
Vous trouverez dans ce qui suit le minimum à connaître pour être en
mesure d'écrire des expressions rationnelles et des règles
Motif | Signification | Exemple |
---|---|---|
. | Correspond à tout caractère unique | c.t correspondra à cat ,
cot , cut , etc. |
+ | Répète le caractère de correspondance précédent une ou plusieurs fois | a+ correspond à a , aa ,
aaa , etc. |
* | Répète le caractère de correspondance précédent zéro ou plusieurs fois | a* correspond à tout ce à quoi correspond
a+ , mais correspond aussi à la chaîne vide. |
? | Rend la correspondance optionnelle. |
colou?r correspondra à color et colour . |
^ | Appelé ancrage, correspond au début de la chaîne | ^a correspond à une chaîne qui commence par
a |
$ | L'autre ancrage, correspond à la fin de la chaîne. | a$ correspond à une chaîne qui se termine par
a . |
( ) | Regroupe plusieurs caractères en une seule entité, et conserve une correspondance à des fins d'utilisation dans une référence arrière. | (ab)+
correspond à ababab - à savoir, le +
s'applique au groupe.
Pour plus de détails sur les références arrières, voir ci-dessous. |
[ ] | Une classe de caractères - correspond à un des caractères de la classe | c[uoa]t correspond à cut ,
cot ou cat . |
[^ ] | Négation de la classe de caractères - correspond à tout caractère ne faisant pas partie de la classe | c[^/]t correspond à cat ou
c=t mais pas à c/t |
Avec !
peut
préfixer une expression rationnelle afin d'en exprimer la négation.
Autrement dit, une chaîne ne correspondra que si elle ne correspond pas
à l'expression située après le !
.
Vous devez vous souvenir d'une chose importante : chaque fois
que vous utilisez des parenthèses dans un Modèle ou dans
un des modèles de conditions, des références arrières
sont créées en interne et peuvent être rappelées via les chaînes
$N
et %N
(voir ci-dessous). Ces
références sont disponibles lors de la création des chaînes de
Substitution et des Chaînes de test. La
figure 1
montre à quels endroits les références arrières sont suceptibles
d'être développées, et illustre le flux des comparaisons
effectuées par les règles RewriteRule et RewriteCond.
Figure 1 : Le cheminement d'une référence arrière à
travers une règle.
Une règle de réécriture
Le Modèle est toujours une expression rationnelle 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 requête).
Figure 2 : Syntaxe de la directive RewriteRule.
La chaîne de Substitution peut, quant à elle, être de trois types :
Ceci peut faire correspondre une requête à toute localisation voulue de
votre système de fichiers, un peu comme la directive
Si la directive /usr/local/apache2/htdocs
, cette règle va faire
correspondre les requêtes pour http://example.com/foo
au
chemin /usr/local/apache2/htdocs/bar
.
Ceci informe le client qu'il doit effectuer une nouvelle requête vers l'URL spécifiée.
La chaîne de Substitution peut aussi contenir des références arrières vers des parties du chemin d'URL entrant correspondant au Modèle. Considérons ce qui suit :
La variable $1
sera remplacée par tout texte
correspondant à l'expression située entre les parenthèses dans le
Modèle. Par exemple, une requête pour
http://example.com/produits/r14df/vue
correspondra au
chemin /var/web/produitsdb/r14df
.
S'il y a plus d'une expression entre parenthèses, elle seront
accessibles selon leur ordre d'apparition via les variables
$1
, $2
, $3
, etc...
Le comportement d'une règle [NC]
:
Pour une liste des drapeaux disponibles, leurs significations, et des exemples, voir le document Drapeaux de réécriture.
Il est possible d'utiliser une ou plusieurs directives
Figure 3 : Syntaxe de la directive RewriteCond
Par exemple, pour renvoyer toutes les requêtes en provenance d'une certaine tranche d'adresses IP vers un autre serveur, vous pouvez utiliser :
Si vous spécifiez plus d'une directive
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"
Les correspondances dans les expressions rationnelles contenues dans
les directives %1
, %2
, 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 :
Si la requête concernait http://example.com/foo/bar
,
alors %1
contiendrait example.com
et
$1
contiendrait foo/bar
.
La directive
La réécriture est en général définie au niveau de la configuration du
serveur principal (en dehors de toute section .htaccess
; ce type de
configuration est cependant plus complexe. Cette technique est appelée
réécriture par répertoire.
La principale différence avec les réécritures au niveau du serveur réside
dans le fait que le préfixe du chemin du répertoire contenant le fichier
.htaccess
est supprimé avant la mise en correspondance dans
la règle