Bonjour,
Pour rediriger des adresses du type /index.php/page.html en /page.html, j'utilise :
RewriteRule ^index\.php\/(.*)\.html$ $1.html [R=301,L]
De plus, je dois réécrire (en interne seulement) /page.html en /index.php/page.html. Pour cela, j'utilise le code :
RewriteCond %{REQUEST_FILENAME} !^index\.php RewriteCond %{REQUEST_FILENAME} ^(.+)\.html RewriteRule ^(.*)$ index.php/$1 [L,QSA]
Ces 2 règles fonctionnent très bien isolément, mais quand j'active les 2 ça provoque une boucle -malgré le flag "Last". Voici ce que je trouve dans le RewriteLog (en résumé) :
internal redirect with /index.php/page.html [INTERNAL REDIRECT] escaping http://monsite.local/page.html for redirect redirect to http://monsite.local/page.html [REDIRECT/301]
J'ai donc 3 questions :
1) Pourquoi la deuxième règle provoque-t-elle une réécriture interne quand la première est active, alors qu'elle est en deuxième position et que je précise [L] pour que d'autres règles ne s'appliquent pas ?
2) Je croyais avoir compris que le fichier htaccess est lu 1 seule fois à chaque requête HTTP, mais j'en conclus qu'il est lu à chaque requête ET à chaque fois qu'une RewriteRule a modifié l'adresse de la page demandée. C'est bien ça ?
3) Si c'est le cas, je dois donc n'appliquer ma première règle qu'aux URLs externes (demandées par HTTP), et surtout pas aux URLs réécrites en interne. Mais comment ? Je provoque une erreur 500 quand je précède la première règle avec :
RewriteCond %{REQUEST_URI} ^index\.php\/(.*)\.html$
Merci de vos avis éclairés !