Aujourd’hui, petit billet sur l’url-rewriting pour la mise en place d’une règle très spécifique : l’application de plusieurs RewriteRule pour une seule RewriteCond.
Pour ceux qui ont déjà été confronté au problème, la méthode consistait à reprendre la RewriteCond et à la recopier avant chaque RewriteRule devant s’y appliquer. Mais pour des raisons de lisibilité (j’aime le code indenté, alors un .htaccess doit également être propre), il existe une astuce permettant d’appliquer plusieurs règles (RewriteRule) à une seule condition (RewriteCond).
Voici comment procéder :
Avant de commencer, je vais prendre un exemple simplissime ou vous souhaiteriez rediriger un ancien domaine vers un nouveau. A vous d’adapter cet exemple à votre cas.
Comment faisiez vous avant ?
# On redirige la racine du site RewriteCond %{HTTP_HOST} ^www.example.com$ RewriteRule ^$ http://www.newdomain.com [R=301,L] # Admettons que nous n'ayons que des pages a la racine RewriteCond %{HTTP_HOST} ^www.example.com$ RewriteRule ^(.*)$ http://www.newdomain.com/$1 [QSA,L,R=301] |
Comment fait on maintenant ?
# La RewriteCond que l'on souhaite RewriteCond %{HTTP_HOST} !^www.example.com$ RewriteRule .* - [S=2] # Maintenant les RewriteRule RewriteRule ^$ http://www.newdomain.com [R=301,L] RewriteRule ^(.*)$ http://www.newdomain.com/$1 [QSA,L,R=301] |
Maintenant que nous avons vu comment faire dans la pratique, expliquons un peu comment cela fonctionne.
Vous avez remarqué que la ligne :
« RewriteCond %{HTTP_HOST} ^www.example.com$ »
s’est transformée en :
« RewriteCond %{HTTP_HOST} !^www.example.com$ »
Vous avez également pu voir que juste après cette ligne, est venu se glisser un :
« RewriteRule .* – [S=2] ».
Pour traduire ces deux lignes en langage compréhensible, cela signifie : « Si le domaine N’EST PAS www.example.com (=> RewriteCond %{HTTP_HOST} !^www.example.com$), ignore les 2 règles qui suivent (=> RewriteRule .* – [S=2]) ».
Ce qui revient à dire (en enlevant les négations) : « Si le domaine est www.example.com, applique les 2 règles qui suivent ». Pour votre information, le S de [S=2] signifie SKIP, donc vous aurez bien compris que si vous souhaitez appliquer 7 RewriteRule, il vous faudra mettre [S=7].
Voila, c’est tout pour aujourd’hui.
9 réponses sur « Une RewriteCond pour plusieurs RewriteRule »
Tu tombes bien, l’autre jour j’ai découvert ça mais n’avait pas vraiment trouvé d’explications. C’est maintenant fait…
Comment ça « c’est tout pour aujourd’hui » hein !?
C’est tout simplement excellent de raccourcir ainsi son .htaccess.
Je fais tourner…
Ah yes super, merci beaucoup, ça va m’aider à amaigrer mon énorme .htaccess.
Si t’en as d’autres comme ça, je prends 🙂
Je connaissais le Skip, y a un topic sur Webmasterworld. Je donne le lien ?
@Tous :
Vu que vous etes fans de tuning htaccess, je vous prepare un prochain billet qui devrait vous faire plaisir 😉
Stay connected …
@Consultant référencement :
Si ton lien est complémentaire à l’article, tu peux le poster ça ne me dérange pas.
P.S. : C’est un commentaire désobligeant ou une simple question ?
Je visitais l’article sur les RewriteMap, en tombant par hasard sur cet article, tu répond pile à une problématique que j’avais, pour l’autre je passais par un système de macros sur Excel.
Pour ce qui nous interesse, en l’occurent Effectivement, on rajoutait systématiquement une RewriteCond devant chaque Rewriterule, la condition étant le remplissage de plusieurs champs de la BDD ou le nom de différents champs de la BDD, en gros, un magnifique bordel.
Nice Job 🙂
C’est bon ca !!! Merci beaucoup pour cette astuce, bien pratique, et évite la répétition 🙂
Merci RDD !
Par contre ne serait-il pas plus efficace de dire « si le ndd est http://www.newdomain.com, ignore les règles » ?
On traiterait a priori ainsi les cas où l’on est sur example.com, http://www.example.com et newdomain.com, non ?
Très bonne astuce, j’espère qu’il y aura d’autres lors du TekNseo en Mars 🙂
Vivement le prochain billet sur le htaccesss