Apache serveur Web - Rewrite Module

RewriteEngine :

Syntax: RewriteEngine on|off
Default: RewriteEngine off

La directive RewriteEngine active ou désactive le moteur de réécriture. Si elle est à OFF alors il n'y a pas de réécriture.
Il est à noté que par défaut, la configuration de réécriture n'est pas hérité. Ainsi vous devez activé le RewriteEngine pour chaque VirtualHost dans lequel vous désirez l'utilisé.

RewriteLog :

Syntax: RewriteLog chemin_vers_fichier_delog
Default: aucun

Si le chemin ne début pas par / (slash), il sera concidéré par defaut comme étant placé dans le ServerRoot (chemin relatif). Ce fichier contiendra les log de réécriture d'adresse. Il est conseillé d'utilisé RewriteLogLevel afin d'obtenir le niveau de log désiré.

Exemple:

RewriteLog "/usr/local/var/apache/logs/rewrite.log"

RewriteLogLevel :

Syntax: RewriteLogLevel Level
Default: RewriteLogLevel 0

Cette directive permet de setter le niveau de verbose du log. 0 étant le plus faible (aucune log) et 9 étant le plus verbeux (toutes les actions sont loguées). Notez que plus le mode est verbeux, plus apache sera ralentit.

Example:

RewriteLogLevel 3

RewriteCond :


Syntax: RewriteCond Chainetesté Condition
Default: Aucun

La directive RewriteCond définit un condition dans une règle de réécriture. Elle précède une directive RewriteRule ou une ou plusieurs autres directive RewriteCond.

"Chainetesté" est une chaine de caractères contient des "server-variables". Ces variables se présentent sous la forme : %{ NAME_OF_VARIABLE }

Ces NAME_OF_VARIABLE peuvent prendre ces formes là :

HTTP headers:

HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT

connection & request:

REMOTE_ADDR
REMOTE_HOST
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE

server internals:

DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE

system stuff:

TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME

specials:

API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ

Note : Toutes ces variables correspondent à des noms similaires à des entête http. La plupart sont documentées dans le man, seule celles-ci sont spécifique au modules mod_rewrite :

IS_SUBREQ :
Contient "True" si la requête en cours a été lancé depuis une sous-requête, et contient "False" dans les autres cas.

API_VERSION :
Contient la version d'Apache.

THE_REQUEST :
Contient les entêtes http complêtes envoyé par le navigateur au serveur.

REQUEST_URI :
Contient la ressource demandé dans la requête http

REQUEST_FILENAME :
Contient le chemin d'accès système total du fichier ou du script appellé dans la requête.

"Condition" est une expression régulière qui est appliquée a la "chainetesté". La "chainetesté" est évaluée puis comparée à la "condition".

Note importante :

"condition" est une expression régulière étendue standard avec quelques petits plus :

1. vous pouvez préfixer la condition d'un '!' (point d'exclamation) pour lui spécifier qu'il ne s'agit pas d'une condition contraire.

2. Il y a quelques variantes des conditions. Au lieu d'utiliser une expression régulière, vous pouvez utiliser quelques opérateurs comme :

° '<condition' (inférieur)
° '>condition' (supérieur)
° '=condition' (égal)
° '-d' (directory - répertoire)
° '-f' (fichier)
° '-s' (fichier avec une taille - size)
° '-l' (Lien symbolique)
° '-F' (Fichier via une sous-requête)
° '-U' (URL existante via une sous-requête)

Au besoin vous pouvez appliquer des Flags aux conditions.

[Flags] <= Syntaxe.

Les flags sont la troisième partie de la directive de condition. Ils peuvent être plusieurs et dans ce cas ils sont enchainés et séparé par des virgules :

* 'nocase|NC' (no case) - retire le case sensitive

* 'ornext|OR' (or next condition) - permet la combinaison de deux conditions avec un OR (ou) :

RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule ...ce qui est à appliquer aux hosts.

 

Exemple de RewriteCond :

Pour afficher une page d'accueil en fonction du navigateur de l'internaute :

RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^/$ /homepage.mozilla.html [L]

RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule ^/$ /homepage.text.html [L]

RewriteRule ^/$ /homepage.autres.html [L]

Explication : si vous utilisez thunderbird comme navigateur (identifié comme Mozillia), alors vous aurez la page homepage.mozilla.html qui s'affichera, si vous utilisez lynx alors ce sera la page homepage.text.html et enfin si vous venez avec un autre navigateur (IE par exemple) alors ce sera la page homepage.autres.html.

RewriteRule :

Syntax: RewriteRule Pattern Substitution
Default: Aucun

La RewriteRule est une directive de réécriture assez brutale. Cette directive passe avant tout autre script. Chaques directive définit une seule règle de réécriture. L'ordre de définition de ces règles est important, car si la dernière est cachée par la première alors celle-ci ne s'appliquera pas.

Pattern peut être une expression régulière qui est appliquée à l'URL en court. Ici en court veut dire la valeur qu'a l'URL au moment où est exécuté la réécriture. En effet l'URL d'origine peut avoir été altéré par des rewriterules précédente.

Quelques conseils au sujet de la syntaxe des expressions régulières :

Text:
. Un seul caractère
[chars] Chaine de caractères: un des caractères
[^chars] Chaine de caractères: Aucun des caractères
text1|text2 Au choix: text1 ou text2

Quantifiers:
? 0 ou 1 du texte précédent
* 0 ou N du texte précédent (N > 0)
+ 1 ou N du texte précédent (N > 1)

Grouping:
(text) Groupement de texte
(pour placer les frontières d'une alternative ou pour la fabrication des backreferences où le nième groupe peut être employé sur le RHS d'un RewriteRule avec le $N)

Anchors:
^ Start of line anchor
$ End of line anchor

Escaping:
\caractère Echape ce caractère

Il est également possible avec mod_rewrite d'utiliser le caractère de négation (!). Ceci vous donne la possiblité de rendre négative l'expression, par exemple, ``si l'URL en court N'EST PAS comme cette expression''. Ceci peut être utilisé dans des cas exeptionnel où il est plus facile d'utiliser la négation que la forme traditionnel de la règle.

Substitution dans une règle de réécriture est une chaine qui est substituée (ou remplacer) à l'URL original sur laquel la règle est appliquée.

1. back-references $N à la RewriteRule pattern
2. back-references %N à la dernière RewriteCond appliquée à la pattern
3. server-variables comme dans une condition test-strings (%{VARNAME})
4. mapping-function appelle (${mapname:key|default})

Back-references sont $N (N=0..9) indicateur qui remplaceront le contenu de Nème groupe de la Patern étudiée. Les server-variables sont les même que pour les Chainetesté dans une RewriteCond.

Comme nous l'avons dit précédament, toutes les règles de réécritures sont appliquées à la chaine substituée (Dans l'ordre de leur définition dans le fichier de config). L'URL est complètement remplacée par la chaine de substitution et les réécritures continuent leur progressions jusqu'à ce qu'il n'y est plus de règles ou que l'un de celle-ci soit terminée par le flag L.

Listes des Flags [Flags] :

* 'redirect|R [=code]' (force redirect)
Préfixé d'une Substitution avec http://url[:port]/ pour forcer une redirection externe. Si aucun code de reponse HTTP n'est donné alors c'est le 302 (MOVED TEMPORARILY) qui est utilisé. Si vous voulez utiliser un autre code de réponse dans la tranche 300-400, il suffit de le spécifié comme un nombre ou d'utiliser le nom symbolique associé : temp (default), permanent, seeother. Utiliser cette règle, "canonise" l'URL, c'est à dire que vous allez renvoyer la nouvelle URL au client.

Note: Quand vous utilisez ce Flag, faites attention à utiliser une URL valide, sinon vous redirigerez l'internaute sur une adresse inexistante.Pour stoper la réécriture, vous devrez placer le Flag L à la fin de la règle.


* 'forbidden|F' (force URL to be forbidden)
Ceci force le renvoie Erreur 403 sur l'URL utilisé. Utilisez ce flag en conjonction avec des RewriteConds appropriées pour bloquer certaines URL.


* 'gone|G' (force URL to be gone)
Ceci force le code reponse HTTP 410 (GONE). Utilisez ce floag pour indiquer qu'une page n'existe plus par exemple.


* 'proxy|P' (force proxy)
Ce flag force l'utilisation d'un proxy. Ceci peut être utile dans le cas où vous désirez accèder à un sous site dans un réseau local, qui est protègé par un proxy. Ainsi vous forcé l'internaute à passer par le proxy (module apache proxy) pour accèder à l'URL désirée.

* 'last|L' (last rule)
Arrête le processus de réécriture.

* 'next|N' (next round)
Relance le processus de réécriture depuis le début. Mais prends l'URL en court et non l'URL d'origine.
Attention à ne pas créé une boucle infinie !!!!


* 'chain|C' (chained with next rule)
Ce flag permet d'enchainer la règle en court avec la suivante. Ceci a pour effet : si la règle a été appliqué alors on continue le processus.


* 'type|T=MIME-type' (force MIME type)
Force le MIME-type sur le fichier de destination.

* 'nosubreq|NS' (used only if no internal sub-request)
Ce Flag force le moteur de réécriture a passer le règle si la requête émane d'une sous-requête interne.


* 'nocase|NC' (no case)
Supprime le case-insensitive


* 'qsappend|QSA' (query string append)
Ce flag force la moteur de réécriture a appliqué une chaine de caractère dans la chaine de substitution afin de la remplacer.


* 'noescape|NE' (no URI escaping of output)
Ce flag permet à la règle de prendre en compte les caractères régulièrement "échapé" dans les expression régulière. ('%', '$', ';', etc...)

* 'skip|S=num' (skip next rule(s))
Ce flag permet au processus de réécriture d'ignorer la règle suivante si la règle est appliquée.

* 'env|E=VAR:VAL' (set environment variable)
Force l'utilisarion de variable d'environnement appellé VAR. Vous pouvez utiliser ce flag dans le cas où vous avez besoin d'utiliser plusieurs variables;

Exemples Concrêts en application :

RewriteEngine On
RewriteLog /var/log/apache2/rewrite
RewriteLogLevel 4

RewriteRule !\.(gif|css|jpg|png|jar|ico|js|html|flv|xml)$|..*(ajax).*|.*(var).*|.*(export_pdf).*|.*(pdf.php).* /index.php

# Permet de rajouter index.php sauf pour pour les fichiers gif,css,jpg etc... et les répertoire ajax, var, etc...

RewriteCond %{HTTP_HOST} ^mydomaine\.fr$ [NC]
RewriteRule ^(.*)$ http://www.site.com/Informer/toto/fiche.php [R=301,L]

# Permet de rediriger directement sur la page fiche.php quand on arrive du domaine mydomaine.fr

RewriteCond %{REQUEST_URI} ^/ind\.asp$
RewriteRule ^(.*)$ http://www.site.com/var/redirect.php [R=301,L]

# Permet de rediriger vers la page redirect.php toutes les requetes envoyées vers une page asp débutant par ind.

RewriteEngine On
RewriteLog /var/log/apache2/rewrite
RewriteLogLevel 4

RewriteCond /var/data/var/flash/home.swf -f
12 RewriteRule ^/$ /var/data/flash_accueil/index.php [L]

# Permet de faire une home page avec une animation flash. Ne s'affiche que quand le fichier home.swf est présent. (idéal campagne promotionnelle)

Retour à l'index Linux