Bloquer l'URL canonique sur une URL virtuelle

Nouveau WRInaute
Bonjour !

Ce la fait quelques jours que je cherche la solution à mon problème et pas moyen de trouver quelque chose qui fonctionne. J'en viens à vous demander votre aide car j'ai l'impression d'avoir tout essayé ! :?

J'explique mon problème :
Sur mon site, tous les fichiers sont des ".php" physiquement présent sur le serveur. Je souhaite pourvoir y accéder via une page .html.

Pour ça pas de problème, une règle possible est :
Code:
RewriteRule (.+)\.html(.*) $1.php$2 [L]

Cela deviens plus difficile lorsque je souhaite "bloquer" les URL sur l'extension .html c'est à dire que si je reçoit une URL avec un .php, je souhaite faire une redirection 301 sur la même page mais avec l'extension en .html. Celle ci sera ensuite réécrite par le module pour afficher la page .php

Mon code donne alors :
Code:
RewriteRule (.+)\.php(.*)  http://www.site.com/$1.html$2 [R=301]
RewriteRule (.+)\.html(.*) $1.php$2 [L]

Problème : lorsque j'entre une URL .php, jai bien une redirection et mon navigateur va bien demander la même page en .html.
Le module compare la première règle qui est fausse donc continue puis tombe sur la règle de l'html. Il réécrit donc l'URL mais réévalue ensuite tous le fichier ! :| Ce qu'il fait qu'il retombe dans la 1ere règle et donc redirige sur le .html... etc... et ça boucle !
Cela même avec le drapeau [L] ou n'importe quel autre drapeau. J'ai bien essayé des conditions en tout genre mais pas moyen de l'empêcher de réévaluer la nouvelle URL html une fois qu'il l'a réécrite...

Auriez vous une idée pour résoudre ce problème ?

D'avance merci !
 
WRInaute passionné
En inversant les 2 règles ? 404 ?

SInon le plus simple est de faire un 301 vers .html directement dans la page PHP si la REQUQEST_URI est en .php
 
Nouveau WRInaute
Si on inverse les deux règles, il va d'abord réécrire l'URL .html en .php (si elle ne l'est pas déjà) puis va effectuer la redirection 301 ce qui va provoquer le rechargement de la page et donc la ré-exécution du .htaccess. On va donc avoir une belle boucle. :(

Tout cela parce que le script ne "respecte" pas le drapeau [L]... :x
C'est vraiment bizzare qu'il ne le respecte pas. Même si je lui ajoute un [NS] pour éviter les sous-requête, cela ne change rien. Il ré-exécute le script complet à la fin de la réécriture... :?:

Pour ce qui est de la redirection .php, si je pouvais éviter de mélanger réécriture et contenu, ce serait bien. Si je peux tout faire d'un même endroit c'est bien plus simple à gérer. Même si cette solution est tout à fait viable et que je m'y résignerais si aucune solution n'est trouvée.
 
Nouveau WRInaute
J'ai testé tes différentes propositions. Toujours pareil, le fichier se recharge et fait tout planter.
Même si je mets des conditions :
Code:
RewriteCond %{REQUEST_URI} \.php
J'ai bien testé dans tous les sens possibles mais en vain. J'ai aussi essayé avec un skip [S=1] pour sauter l'une ou l'autre des instructions selon le cas mais rien n'y fait... :cry:
Testé aussi avec des
Code:
RewriteCond %{IS_SUBREQ} false
pour essayer d'éviter le bug en cas de sous requête dans un sens ou dans l'autre toujours pareil...

J'ai aussi essayé de passer par un fichier externe qui lui effectue une redirection 301 sur la bonne page en html pour essayer de contrer le rechargement de la page en comparant les différents HTTP_REFERER mais il semblerait que la page qui effectue la redirection ne soit pas pris en compte et donc retour point de départ.

Plus je teste et plus je trouve tout cela étrange...
 
Discussions similaires
Haut