HTACCESS

Règle de réécriture avec plus de 9 paramètres

Il n'est pas possible d'avoir plus de 9 rétroréférences avec le motif d'une RewriteRule. Ainsi $10 ne correspond pas à la dixième rétroréférence mais correspond à $1 suivi d'un 0.

Pour contourner le problème deux solutions sont possibles. La première est de regrouper les motifs pour faire le traitement en php (avec par exemple l'utilisation de la fonction explode).
La deuxième solution consiste à utiliser les rétroréférences de la RewriteCond que l'on va ajouter juste avant notre RewriteRule. C'est cette dernière solution qui est décrite ci-dessous.

Il est possible d'aller jusqu'à 9+9=18 paramètres avec cette solution en utilisant les 9 rétroréférences de la RewriteCond (%1 à %9) et les 9 rétroréférences de la RewriteRule ($1 à $9).

Nous avons par exemple l'url suivante contenant 10 paramètres notés de p1 à p10 :
/page.php?p1=aaa&p2=bbb& ? &p10=jjj
que nous souhaitons réécrite en :
/page-aaa-bbb- ? -jjj.html

Une astuce consiste à utiliser la rétroréférence $0 comme chaîne de test de la RewriteCond. Elle correspond au motif complet de notre RewriteRule. En d'autre terme c'est égal à l'url complète : page-aaa-bbb- ? - jjj.html
Le motif de la condition permet de capturer le 10ème paramètre. Le paramètre p10 est alimenté avec la rétroréférence %1. Les 9 premiers paramètres sont capturés par le motif de la règle. Les paramètres de p1 à p9 sont alimentés avec les rétroréférences notées de $1 à $9.

Remarque : La probabilité pour que vous ayez vraiment besoin de ce code est excessivement faible. Il n'est même pas recommandé de l'utiliser car il y a un risque qu'une telle url soit considérée comme du spam. Ce code peut par contre être utilisé dans le cadre d'un intranet ou dans la partie administration.

RewriteEngine On
RewriteCond $0 ^page-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-[^-]*-([^-]*)\.html$ 
RewriteRule ^page-([^-]*)-([^-]*)-([^-]*)-([^-]*)-([^-]*)-([^-]*)-([^-]*)-([^-]*)-([^-]*)-[^-]*\.html$ /page.php?p1=$1&p2=$2&p3=$3&p4=$4&p5=$5&p6=$6&p7=$7&p8=$8&p9=$9&p10=%1
PHP