Catégories
Apache

Une RewriteCond pour plusieurs RewriteRule

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 »

@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 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *