Appliquer les RewriteCond à plusieurs RewriteRule

En consultant les log du module apache en charge de la ré-écriture d’url j’ai constaté que certaines règles étaient appliquées sur des URL pour lesquelles je pensais avoir des conditions d’exclusions.

Quelques recherches Google plus tard et lecture des doc apache, je me suis rendu compte que je commettais une erreur car en fait les RewriteCond (même combinés) ne s’appliquent que sur la première RewriteRule qui suit.

Donc pour éviter d’avoir à répéter un bloc de RewriteCond à plusieurs RewriteRule, (par exemple rediriger plusieurs URL d’un ancien nom de domaine vers leurs correspondances sur un nouveau nom de domaine), il convient de résonner par négation et d’utiliser la « flag substitution » [S=XX] ou XX est le nombre de règles à ignorer si la condition est vraie.

Par exemple : Je veux appliquer les 5 RewriteRule suivantes uniquement aux URLS associées au domaine eticweb.com

[code type= »shell »]
RewriteRule ^dossiers-thematiques/42-e-commerce.html http://eticweb.com/category/dossier-thematique/e-commerce [R=301,L]
RewriteRule ^dossiers-thematiques/42-e-commerce/22-paypal-vs-banque.html http://eticweb.com/dossier-thematique/e-commerce/paypal-vs-banque [R=301,L]
RewriteRule ^dossiers-thematiques/46-qr-code.html http://eticweb.com/category/dossier-thematique/qr-code [R=301,L]
RewriteRule ^dossiers-thematiques/46-qr-code/52-presentation-qr-code.html http://eticweb.com/dossier-thematique/presentation-des-qr-codes [R=301,L]
RewriteRule ^dossiers-thematiques/46-qr-code/51-generation-de-qr-code.html http://eticweb.com/dossier-thematique/generation-de-qr-code [R=301,L]
[/code]

Pour éviter de devoir faire précéder chacune de ces RewriteRule par le test de condition (RewriteCond) suivant :

[code type= »shell »]
RewriteCond %{HTTP_HOST} ^eticweb.com [NC]
[/code]

Ce qui donnerait :

[code type= »shell »]
RewriteCond %{HTTP_HOST} ^eticweb.com [NC]
RewriteRule ^dossiers-thematiques/42-e-commerce.html http://eticweb.com/category/dossier-thematique/e-commerce [R=301,L]
RewriteCond %{HTTP_HOST} ^eticweb.com [NC]
RewriteRule ^dossiers-thematiques/42-e-commerce/22-paypal-vs-banque.html http://eticweb.com/dossier-thematique/e-commerce/paypal-vs-banque [R=301,L]
RewriteCond %{HTTP_HOST} ^eticweb.com [NC]
RewriteRule ^dossiers-thematiques/46-qr-code.html http://eticweb.com/category/dossier-thematique/qr-code [R=301,L]
RewriteCond %{HTTP_HOST} ^eticweb.com [NC]
RewriteRule ^dossiers-thematiques/46-qr-code/52-presentation-qr-code.html http://eticweb.com/dossier-thematique/presentation-des-qr-codes [R=301,L]
RewriteCond %{HTTP_HOST} ^eticweb.com [NC]
RewriteRule ^dossiers-thematiques/46-qr-code/51-generation-de-qr-code.html http://eticweb.com/dossier-thematique/generation-de-qr-code [R=301,L]
[/code]

Je peux inverser mon test et utiliser l’astuce du saut de règles pour éviter les répétitions ce qui donnera finalement :

[code type= »shell »]
RewriteCond %{HTTP_HOST} !^eticweb.com [NC]
RewriteRule .* – [S=5]
RewriteRule ^dossiers-thematiques/42-e-commerce.html http://eticweb.com/category/dossier-thematique/e-commerce [R=301,L]
RewriteRule ^dossiers-thematiques/42-e-commerce/22-paypal-vs-banque.html http://eticweb.com/dossier-thematique/e-commerce/paypal-vs-banque [R=301,L]
RewriteRule ^dossiers-thematiques/46-qr-code.html http://eticweb.com/category/dossier-thematique/qr-code [R=301,L]
RewriteRule ^dossiers-thematiques/46-qr-code/52-presentation-qr-code.html http://eticweb.com/dossier-thematique/presentation-des-qr-codes [R=301,L]
RewriteRule ^dossiers-thematiques/46-qr-code/51-generation-de-qr-code.html http://eticweb.com/dossier-thematique/generation-de-qr-code [R=301,L]
[/code]