Version complète: sur le forum Webmaster Hub : Question simple sur la redirection
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > Fichier .htaccess et réécriture d'URLs
hebmaster
Bonjour,

Voila j'avais mes pages sous cette forme :

CODE
ndd.com/index.php?page=nom_de_la_page


j'ai décidé de changer la structure du site (plus de nom de la page passé dans une include) et maintenant il sont sous cette forme :

CODE
ndd.com/nom_de_la_page.php


quel est le code a mettre ds le htaccess pour redirectionner les anciens url vers l'url exacte

Merci d'avance
calim
Je dirais que tu peux mettre ça :

CODE
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^index.php?page=([a-z]+)$ /$1.php [L]


Mais je suis pas sur à 100%
hebmaster
CITATION(calim @ lundi 29 mai 2006, 17h15) *
Je dirais que tu peux mettre ça :

CODE
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^index.php?page=([a-z]+)$ /$1.php [L]


Mais je suis pas sur à 100%


Ca marche pas unsure.gif désolé ...
j'attend toujours votre aide ... ca fait plus d'un mois que je cherche et j'ai pas encore trouvé de solution ...
Jeanluc
Bonjour,

Ce que tu veux faire est expliqué ici : Mod_rewrite, ou la réécriture des URL "à la volée".

Jean-Luc
hebmaster
Merci pour l'article ,
je l'ai lu presque en entier ...
J'ai essayé d'ecrire un truc moi meme mais ca marche pas voila les codes que j'ai essayé mais il ne marche pas sachant que j'ai url rewrinting marche bien sur mon serveur :

CODE
RewriteEngine on
RewriteRule ^([a-z]+)\.php$ index.php?page=$1 [L]


ou

CODE
RewriteRule ^index\.php?page=([a-z]+)$ $1.php [L]



CODE
RewriteRule ^index.php?page=([a-z]+)$ $1.php [L]



CODE
RewriteRule ^index.php?page=([a-z]+)$ /$1.php [L]


connaissez vous la raison?
TheRec
Bonsoir,

le sous-masque ([a-z]+) n'autorise que les lettres de a à z en minuscules ... est-ce que lorsque tu testes ta réécriture, tu n'utilises que ces caractères dans le nom de ta page ? Si tu veux élargir la portée de ce sous-masque tu peux éventuellement le replacer par ceci :
CODE
RewriteEngine on
RewriteRule ^(.+)\.php$ index.php?page=$1 [L]

Le "point" signifie n'importe quel caractère.

La deuxième partie peut nécessiter un "/" avant index.php cela dépend de la configuration de ton serveur.

Tu peux également utiliser le flags par [R=301], ainsi tu verras (dans la barre d'adresses, car en fait mod_rewrite effectuera une redirection) vers quelle URL, Apache se tourne pour faire la réécriture.

Pour les expressions que tu proposes, elles sont "erronées" dans le sens où tu ne souhaites pas réécrire une URL du type index.php?page=ma_page en ma_page.php, mais l'inverse...
hebmaster
Moi mes anciens page sont sous cette forme ndd.com/index.php?page=nom_page mes nouvelles pages sont nom_page.php donc j'ai inversé le code :
CODE
RewriteEngine on
RewriteRule ^index.php?page=$1$ (.+)\.php [L]


Mais ca marche toujours pas sad.gif
TheRec
Tu souhaites passer de index.php?page=nom_page à nom_page.php donc la règle dans l'ordre que je te l'ai donnée est juste, il ne faut pas l'inverser comme tu l'as fait.

La première partie de la RewriteRule est une expression régulière (de type POSIX), c'est à dire un masque (composé en général de sous-masque) qui correspond à ce que l'utilisateur demandé comme URL relative (dans ton cas nom_page.php).

La deuxième partie correspond à l'URL relative (si tu mets une URL absolue, avec http://, ce n'est plus une réécriture, mais une redirection) qu'utilise Apache en interne pour présenter le contenu désiré (pour toi index.php?page=nom_page).

La dernière partie est l'ensemble de flags qui correspondent à la règle, les plus utiles sont cités dans l'article qu'on t'a recommandé précédemment.

Bien, il faut ensuite savoir que la réécriture ne se fait pas "tout seule", tu dois modifier tes liens dans tes fichiers (x)HTML de manière à ce qu'ils correspondent à ton nouveau schéma d'URL (c'est à dire nom_page.php).
real34
Il me semble qu'il a modifié tous ses noms de fichiers et qu'il a juste enlevé l'include de la page index.php (c'est ce que j'ai compris). Donc actuellement tous ses liens sont de la forme index.php?page=mapage et il faut que ces liens pointent vers mapage.php

Donc il faut en effet inverser l'ordre des adresses, ainsi on a :
RewriteEngine on
RewriteRule ^index.php?page=(.+)$ $1.php [L]

Par contre, je ne sais pas si j'ai bien compris le problème wink.gif
TheRec
C'est juste, j'ai mal compris la dernière partie du problème, j'ai supposé qu'il souhaiter faire pointer l'URL sans paramètre vers celle avec paramètres...alors qu'il ne voulait plus utiliser cette dernière

Le seul problème c'est que le RewriteRule ne prends pas en compte la querystring (ce qui vient après le ?). Donc il faut passer par un RewriteCond :
CODE
RewriteEngine On
RewriteCond %{QUERY_STRING} ^page=(.+)$
RewriteRule ^index.php$ %1.php? [L]

%1 est la backreference de trouvée par RewriteCond.
Le point d'interrogation après %1.php sert à ce que la querystring originale ne soit pas appondue.

Si tu as besoin de prendre en compte les URL ou index.php est omis, tu peux utiliser la règle suivante :
CODE
RewriteRule (^index.php$|^$) %1.php? [L]

Après le RewriteCond évidemment.

Si tu veux que ce soit une redirection qui soit effectuée, il te suffit de préciser l'URL complète ou doit être redirigé l'utilisateur :
CODE
RewriteRule (^index.php$|^$) http://ndd.com/%1.php? [L]

Apparemment le flag [R=301] ne fonctionne pas en conjonction avec RewriteCond...mais ce problème n'est pas document, il est peut-être dû à mon environnement de test...

P.S.:
CITATION(hebmaster @ lundi 29 mai 2006, 11h16) *
quel est le code a mettre ds le htaccess pour redirectionner les anciens url vers l'url exacte

C'est pas que je veuille jouer le professeur de français, mais "redirectionner" n'est pas un mot français... je suppose que tu voulais dire "rediriger" wink.gif
hebmaster
Merci a lot pour votre aide j'ai enfin trouvé la solution(grave a vous) et spécialement grace à TheRec ....merci ...

Voila le code que j'ai mis :
CODE
RewriteCond %{QUERY_STRING} ^page=(.+)$
RewriteRule (^index.php$|^$) http://www.toutrabat.com/%1.php? [L]


ca marche a merveille ...et c grace a vous tks ...

et je suis désolé j'ai pas tres bien expliqué bien mon probleme au debut ...
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.