Aller au contenu

Redirection externe et réécriture interne : comment éviter une boucle infinie ?


goulvench

Sujets conseillés

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 !

Lien vers le commentaire
Partager sur d’autres sites

Salut,

je ne comprend pas très bien ce que tu désires faire. Et qu'est ce que tu appelles une redirection en interne ?

Ne désires-tu pas simplement que les urls n'affichent pas /index.php/ et que les liens fonctionnent quand même ? C'est bien ça ?

++

Patrick

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Patrick,

Si j'ai bien compris, une redirection externe c'est quand le serveur renvoie le header 301 ou 302. Une réécriture interne, c'est quand le serveur modifie l'adresse demandée avant de la passer au script PHP (ou autre).

En l'occurrence, je veux rediriger les adresses de la forme index.php/*.html mais traiter les adresses du type *.html comme index.php/*.html.

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...