Url rewriting et redirection 301 [R=301,L] ne fonctionne pas ensemble

Nouveau WRInaute
Bonjour à tous,
je vous explique donc précisément la problématique :
-j'ai un site http://www.monsite.fr
-Mon nom de domaine pointe sur le dossier monsite sur mon serveur linux mutualisé de chez godaddy (tous les fichiers et dossiers relatifs à mon site web se trouvent dans ce dossier)
-Dans ce dossier j'y est créé mon fichier .htacess
-Voici l'url que j'avais avant : http://www.monsite.fr/mot1-mot2-en.php?action=mot3&numero=10alias=toto
je souhaitais la réécrire de cette façon : http://www.monsite.fr/10-unmot-unautremot-tot et cela de façon dynamique.
-J'ai donc créé cette règle dans mon .htacess :
Options +FollowSymlinks
RewriteEngine On
RewriteRule ^([0-9]+)-unmot-unautremot-(.*)$ /mot1-mot2-en.php?action=mot3&numero=$1&alias=$2 [L]
-Ensuite j'ai modifié tous les anciens liens dans mes pages :
mot1-mot2.php?action=mot3&numero=<?php echo $data['variable1'];?>&alias=<?php echo $data['variable2'];?>
en
<?php echo $data['variable1'];?>-unmot-unautremot-<?php echo $data['variable2'];?>
-Et ça fonctionne bien donc jusqu'ici tous va bien du moins je pense :?
-Lorsque je clique sur un nouveau lien du type : <?php echo $data['variable1'];?>-unmot-unautremot-<?php echo $data['variable2'];?> je me dirige bien vers la bonne page et l'url dans la barre d'adresse est au bon format (nouveau format) donc la réécriture fonctionne.
Maintenant j'aurais voulu mettre en place une redirection 301 pour éviter le duplicate content... donc j'ai essayé pas mal de façon (redirectpermanent, flag[R=301,L], ...) et sans succès, une fois la réécriture fonctionne mais pas la redirection 301, une fois la redirection 301 fonctionne mais la réécriture ne se fait pas (l'url dans la barre d'adresse est dans l'ancien format).

Donc voici ce que j'essaye de faire :
Options +FollowSymlinks
RewriteEngine On
RewriteRule ^([0-9]+)-unmot-unautremot-(.*)$ /mot1-mot2-en.php?action=mot3&numero=$1&alias=$2 [R=301,L]

Avec l'exemple ci-dessus la redirection 301 se fait mais pas la réécriture, pareil si je mets [L,R=301]

Comment arriver à faire cohabiter la réécriture et la redirection en même temps?

Je me casse la tête depuis 2jours sur 2petites lignes et la je suis à bout. 8O
Merci beaucoup d'avance à ceux qui voudront bien m'aider. :wink:

Ps : j'aimerais ne pas avoir à utiliser la méthode en php pour effectuer la redirection301
 
WRInaute discret
spyda a dit:
-Voici l'url que j'avais avant : http://www.monsite.fr/mot1-mot2-en.php?action=mot3&numero=10alias=toto
je souhaitais la réécrire de cette façon : http://www.monsite.fr/10-unmot-unautremot-tot et cela de façon dynamique.
-J'ai donc créé cette règle dans mon .htacess :
Options +FollowSymlinks
RewriteEngine On
RewriteRule ^([0-9]+)-unmot-unautremot-(.*)$ /mot1-mot2-en.php?action=mot3&numero=$1&alias=$2 [L]

C'est correct, mais tu peux peut-être remplacer (.*) pour ton alias par quelque chose de plus restrictif histoire d'optimiser (ça reste un détail malgré tout). Egalement, le slash avant ton fichier php est facultatif.

spyda a dit:
-Ensuite j'ai modifié tous les anciens liens dans mes pages :
mot1-mot2.php?action=mot3&numero=<?php echo $data['variable1'];?>&alias=<?php echo $data['variable2'];?>
en
<?php echo $data['variable1'];?>-unmot-unautremot-<?php echo $data['variable2'];?>

Bonne initiative :)

spyda a dit:
Maintenant j'aurais voulu mettre en place une redirection 301 pour éviter le duplicate content... donc j'ai essayé pas mal de façon (redirectpermanent, flag[R=301,L], ...) et sans succès, une fois la réécriture fonctionne mais pas la redirection 301, une fois la redirection 301 fonctionne mais la réécriture ne se fait pas (l'url dans la barre d'adresse est dans l'ancien format).

Bonne initiative également ! Tu es proche de la solution, ton problème vient à mon avis d'une boucle infinie de redirection.
Pour éviter cette boucle, il faut faire une petite parade, quelque chose comme ceci:

Code:
RewriteEngine on

RewriteRule     ^([0-9]+)-unmot-unautremot-([a-z]+)$     mot1-mot2-en.php?action=mot3&numero=$1&alias=$2&stopboucle [L]

RewriteCond     %{QUERY_STRING}         ^action=mot3&numero=([0-9]+)&alias=([a-z]+)$
RewriteRule      ^mot1-mot2-en.php$     %1-unmot-unautremot-%2? [R=301,L]
 
Nouveau WRInaute
Bonjour et merci beaucoup pour ta réponse.
J'ai donc mis en place ce que tu m'as proposé :

Code:
    RewriteEngine on
    RewriteRule     ^([0-9]+)-unmot-unautremot-([a-z]+)$     mot1-mot2-en.php?action=mot3&numero=$1&alias=$2&stopboucle [L]
    RewriteCond     %{QUERY_STRING}         ^action=mot3&numero=([0-9]+)&alias=([a-z]+)$
    RewriteRule      ^mot1-mot2-en.php$     %1-unmot-unautremot-%2? [R=301,L]


j'ai effectué 2 petites modifications :
- ([a-z]+) -> (.*) car mes alias peuvent prendre toutes ces formes : Jean,jean,Jean04,jean04,Jean-04,jean-04,jéan-04
- mot1-mot2-en.php?action=mot3&numero=$1&alias=$2&stopboucle -> /mot1-mot2-en.php?action=mot3&numero=$1&alias=$2&stopboucle car sinon j'ai une erreur 404

La réécriture se fait toujours correctement mais pas de redirection 301 à l'horizon. :?
 
Nouveau WRInaute
Bonjour,
la redirection 301 ne fonctionne pas (quand je regarde dans firebug onglet réseau ou dans différents sites de test de redirection je vois toujours la page appelée en direct link ou code 200 mais pas 301 redirect permanent).
Lorsque que je mets le Flag R seulement, j'arrive à voir cette redirection mais là l'url rewriting ne fonctionne pas dans la barre d'adresse.
Je viens d'essayer avec la technique en PHP pour la redirection 301 mais cette fois ci j'ai l'erreur "header already sent".
Je ne vais jamais m'en sortir.
 
WRInaute discret
Etrange...

Donc, si j'ai bien compris, quand tu appelles l'url réécrite (par exemple ceci) http://www.monsite.fr/10-unmot-unautremot-toto ça pointe bien sur le contenu de mot1-mot2-en.php?action=mot3&numero=10&alias=toto ?

Par contre, quand tu appelles l'url en dur mot1-mot2-en.php?action=mot3&numero=10&alias=toto ça ne te fait pas une redirection 301 vers http://www.monsite.fr/10-unmot-unautremot-toto ?

As-tu bien essayé les bons liens ? Que ce soit dans tes pages web ou urls saisies à la main. Ca peut sembler bête mais j'ai déjà eu le cas sur ce forum.

Pour être sur qu'aucune autre règle ne fasse "collision", désactives TOUT et ne testes que cette partie.
En dernier recours, si ça ne fonctionne vraiment pas et que l'erreur n'est pas trouvée, tu peux toujours passer par le php.
 
Nouveau WRInaute
Je pense être tout proche de la solution, voici mon .htacces :
RewriteEngine on
RewriteRule ^([0-9]+)-unmot-unautremot-(.*)$ /mot1-mot2-en.php?action=mot3&numero=$1&alias=$2 [L]
RewriteCond %{QUERY_STRING} ^action=mot3&numero=([0-9]+)&alias=(.*)$
RewriteRule ^mot1-mot2-en\.php$ http://www.monsite.fr/%1-unmot-unautremot-%2? [R=301]

Donc avec ce code lorsque que je clique sur un nouveau lien (http://www.monsite.fr/10-unmot-unautremot-toto), je me dirige bien vers http://www.monsite.fr/10-unmot-unautremot-toto mais il n'y a aucun contenu (page blanche).
Lorsque je tape dans l'url l'ancien lien : http://www.monsite.fr/mot1-mot2-en.php?action=mot3&numero=10&alias=toto , la redirection 301 fonctionne bien et me redirige vers http://www.monsite.fr/10-unmot-unautremot-toto mais il n'y a aucun contenu (page blanche).

Pourtant, lorsque je laisse ce code simplement :
RewriteEngine on
RewriteRule ^([0-9]+)-unmot-unautremot-(.*)$ /mot1-mot2-en.php?action=mot3&numero=$1&alias=$2 [L]
lorsque que je clique sur un nouveau lien (http://www.monsite.fr/10-unmot-unautremot-toto), je me dirige bien vers http://www.monsite.fr/10-unmot-unautremot-toto et là il y a bien le contenu désiré.

J'ai essayé autre chose, ajout de &stopboucle :
RewriteEngine on
RewriteRule ^([0-9]+)-unmot-unautremot-(.*)$ /mot1-mot2-en.php?action=mot3&numero=$1&alias=$2&stopboucle [L]
RewriteCond %{QUERY_STRING} ^action=mot3&numero=([0-9]+)&alias=(.*)$
RewriteRule ^mot1-mot2-en\.php$ http://www.monsite.fr/%1-unmot-unautremot-%2? [R=301]
lorsque que je clique sur un nouveau lien (http://www.monsite.fr/10-unmot-unautremot-toto), je me dirige vers http://www.monsite.fr/10-unmot-unautremot-toto&stopboucle&stopboucle&stopboucle&stopboucle&stopboucle&stopboucle&stopboucle&stopboucle

J'ai essayé aussi :
RewriteEngine on
RewriteRule ^([0-9]+)-unmot-unautremot-(.*)$ /mot1-mot2-en.php?action=mot3&numero=$1&alias=$2&stopboucle [L]
RewriteCond %{QUERY_STRING} ^action=mot3&numero=([0-9]+)&alias=(.*)$
RewriteRule ^mot1-mot2-en\.php$ http://www.monsite.fr/%1-unmot-unautremot-%2? [R=301[color=#FF0000],L[/color]]
et même résultat que l'exemple précédent.
 
WRInaute discret
Ta dernière manière est la plus correcte, tu es obligé d'avoir [R=301,L] ensemble !

Essayes ceci:

Code:
RewriteEngine on
RewriteBase /

RewriteRule     ^([0-9]+)-unmot-unautremot-(.*)$     mot1-mot2-en.php?action=mot3&numero=$1&alias=$2&stopboucle [L]

RewriteCond    %{QUERY_STRING}     ^action=mot3&numero=([0-9]+)&alias=(.*)$
RewriteRule     ^mot1-mot2-en.php$     %1-unmot-unautremot-%2? [R=301,L]

Sincèrement, si tu recopies EXACTEMENT ce bout de code et que tu testes avec UNIQUEMENT cela dans ton htaccess, et que ça ne fonctionne toujours pas, alors je ne sais pas...

EDIT: testes aussi ceci si ça ne fonctionne pas avec le code plus haut:

Code:
RewriteEngine on
RewriteBase /

RewriteRule     ^([0-9]+)-unmot-unautremot-(.*)$     mot1-mot2-en.php?action=mot3&stopboucle&numero=$1&alias=$2 [L]

RewriteCond    %{QUERY_STRING}     ^action=mot3&numero=([0-9]+)&alias=(.*)$
RewriteRule     ^mot1-mot2-en.php$     %1-unmot-unautremot-%2? [R=301,L]
 
Nouveau WRInaute
Bonjour,
Amen, la deuxième solution fonctionne très bien :
RewriteEngine on
RewriteBase /

RewriteRule ^([0-9]+)-unmot-unautremot-(.*)$ mot1-mot2-en.php?action=mot3&stopboucle&numero=$1&alias=$2 [L]

RewriteCond %{QUERY_STRING} ^action=mot3&numero=([0-9]+)&alias=(.*)$
RewriteRule ^mot1-mot2-en.php$ %1-unmot-unautremot-%2? [R=301,L]

Merci beaucoup pour ton aide acharnée et le temps que tu m'as consacré.
 
Discussions similaires
Haut