Suite et fin de cette série d’articles sur la réécriture d’URL. Aujourd’hui, attaquons-nous aux réécritures conditionnelles.
Les RewriteCond, petit manuel
Cet article est la suite de l’article sur les réécritures d’URL, et nécessite pour être compris de bien connaitre les bases des Regexp et une connaissance au moins sommaire des réécritures d’URLs.

RewriteCond est un mot-clé de la configuration Apache qui permet (comme son nom l’indique si bien) de définir des conditions pour l’application de RewriteRule.
La règle est simple : Une RewriteCond s’applique uniquement pour la RewriteRule qui suivra. Une RewriteRule pout donc avoir plusieurs Rewrite Cond (toutes celles qui le précèdent depuis la dernière Rewrite Rule), mais chaque RewriteCond ne s’applique que pour une seule RewriteRule.
Ces conditions fonctionnent comme toutes les autres conditions en programmation : si elles ne sont pas valides, la Rule est ignorée.
Les RewriteCond se présentent généralement sous la forme RewriteCond string pattern, à quelques exceptions près (je vous en présenterai une plus bas). Si la chaine string correspond (match) le pattern, la condition est valide. La puissance de RewriteCond est que ces strings peuvent contenir des variables serveur, ou même des références de réécritures (les groupes captures par des parenthèses).
Pour illustrer le propos, voila quelques exemples de cas pratiques.
Rediriger plusieurs domaines vers un domaine principal
Votre site est mon-blog.fr, mais vous avez aussi acheté le domaine mon-blog.com . Pour un souci de référencement, vous n’avez certainement pas envie d’utiliser les deux domaines, il faut donc faire une redirection. Voilà la solution :
RewriteCond %{HTTP_HOST} !http://mon-blog.fr$
RewriteRule ^(.*)$ http://mon-blog.fr$1 [R=301, L]
La variable serveur utilisée, HTTP_HOST, correspond à l’hôte présent dans la requête.
Le symbole ! signifie « différent ».
Si l’hôte est différent de http://mon-blog.fr, nous appliquons la redirection vers la bonne adresse.
Appliquer une condition negative
Vous avez décidé de mettre votre Blog dans un sous-dossier, il faut donc rediriger les anciennes URLs. Seul problème, les images, elles, n’ont pas bougé car vous avez decidé de les garder dans un dossier séparé (pour versionaliser votre blog, par exemple).
RewriteCond %{REQUEST_URI} !^/images/(.+)$
RewriteRule ^(.*)$ /blog/$1 [R=301, L]
La variable serveur REQUEST_URI est l’URL de la requête privée de l’hôte.
Cette condition vous permet de rediriger toutes les URLs, a l’exception de celles de vos images.
Appliquer une redirection en fonction de l’origine de la requête
Quelqu’un s’amuse à vous piquer vos articles complets ? Ou bien se permet de linker vos images directement ? La solution (si le dialogue échoue) serait de lui envoyer des images différentes de ce que le reste du monde voit, en réécrivant les URLs en fonction de l’origine de la requête.
RewriteCond %{HTTP_REFERER} !http://blog-de-mon-concurrent-voleur.fr.*$
RewriteCond %{REQUEST_URI} !^/images/.*$
RewriteRule ^(.*)$ /images/dont-steal-please.jpg [L]
Les deux conditions s’appliquent bien à notre règle, et signifient que toutes les requêtes venant de blog-de-mon-concurrent-voleur.fr à destination d’une image afficheront à la place notre image dont-steal-please.jpg, faite pour l’occasion.
Activer un mode « maintenance » en fonction de la présence d’un fichier
Pour finir, voila un exemple un peu exotique, où l’on applique une redirection en fonction de l’existence d’un fichier.
RewriteCond /var/www/mon-blog/tmp/maintenance -f
RewriteCond %{REQUEST_URI} !^/maintenance/.*$
RewriteRule ^(.*)$ maintenance/index.php [L]
Si le fichier maintenance est present, toutes les requêtes seront redirigées vers maintenance/index.php, à moins qu’elles n’y pointent déjà (pour ne pas rediriger les CSS et les images). De cette façon il est très simple de passer et retirer le mode maintenance.
Pour finir

La puissance des RewriteCond est énorme, et je ne peux que vous conseiller d’aller voir la liste des variables serveurs disponibles sur le site d’apache. De plus leur utilisation n’est pas réellement compliquée, la grosse difficulté vient surtout de l’utilisation des Regexp.
N’hésitez pas à poser vos questions en commentaires, que ce soit pour éclaircir un point où proposer un sujet qui pourrait vous intéresser, que je traiterai dans un prochain article.