HTACCESS

Appliquer une condition à  plusieurs règles de réécriture

Une directive RewriteCond ne s'appliquant qu'à la RewriteRule qui suit immédiatement, il est parfois gênant de devoir répéter une condition plusieurs fois. Cela alourdit le fichier .htaccess pour rien. 

Pour éviter cette contrainte il est possible d'utiliser une astuce qui consiste à inverser la condition pour ne pas appliquer nos règles de réécriture. Nous utiliseront pour cela le Flag SKIP qui permet de sauter un certain nombre de règles de réécriture (en fonction du nombre en paramètre). 

Grâce à ce type d'écriture il est même possible de simuler une structure IF - ELSE en utilisant une deuxième réécriture avec le drapeau SKIP.

Nous allons voir un exemple qui permet de n'appliquer des redirections que si le nom de domaine correspond à une ancienne version du site. Dans ce cas là nous redirigerons vers la bonne page sur le nouveau site. Ce cas est utile quand les deux domaines pointent vers le même répertoire et donc partagent le même fichier .htaccess.

# Si le nom de domaine est différent de l'ancien site
RewriteCond %{HTTP_HOST} !^www\.old-site\.fr$
# Alors saute les 3 règles suivantes
RewriteRule .* - [S=3]
# Ces 3 règles ne sont appliquées que si le domaine correspond à l'ancien site
RewriteRule ^/url_old-1.html http://www.new-site.fr/url_new-1.html [NC,R=301]
RewriteRule ^/url_old-2.html http://www.new-site.fr/url_new-2.html [NC,R=301]
RewriteRule ^/url_old-3.html http://www.new-site.fr/url_new-3.html [NC,R=301]
# Fin du IF

#Avec une structure IF - ELSE :
# Si le nom de domaine est différent de l'ancien site
RewriteCond %{HTTP_HOST} !^www\.old-site\.fr$ [NC]
# Alors saute les 4 règles suivantes (les 3 redirections + le SKIP)
RewriteRule .* - [S=4]
# Ces 3 règles ne sont appliquées que si le domaine correspond à l'ancien site
RewriteRule ^/url_old-1.html http://www.new-site.fr/url_new-1.html [R=301]
RewriteRule ^/url_old-2.html http://www.new-site.fr/url_new-2.html [R=301]
RewriteRule ^/url_old-3.html http://www.new-site.fr/url_new-3.html [R=301]
# Cette règle permet de sauter la règle de réécriture du ELSE
RewriteRule .* - [S=1]
# Sinon applique cette règle
RewriteRule ^(.*)$ /index.php?file=$1 [L]
# Fin du IF - ELSE
PHP