Redirection 301 et .htaccess

WRInaute discret
Bonjour,

J'ai réécris dernièrement deux urls et j'aimerais effectuer une redirection 301 des anciennes pages vers les nouvelles, mais en lisant certains tutoriels en ligne je n'arrive pas à comprendre comment m'y prendre.

Voici ce que j'ai dans mon .htaccess concernant les urls en question:

Code:
RewriteRule ^tags/([0-9]+)/([0-9a-zA-Z-]+)\.html$ index.php?page=tag&t=$2&p=$1 [L]
RewriteRule ^auteur/([0-9]+)/(.*)\.html$ index.php?page=author&author_name=$2&p=$1 [L]

Pouvez vous m'aider SVP ?

Merci d'avance.
 
WRInaute discret
e-kiwi a dit:
Oui mais comment l'appliquer, à un moment il faut inverser la regex et c'est là où je ne comprends pas.

EDIT:
Je viens d'essayer cette expression mais ça me renvois une erreur 500:

Code:
RewriteRule ^index.php?page=tag&t=([0-9a-zA-Z-]+)&p=([0-9]+) 
tags/$2/$1.html [R=301]
J'ai suivi ce tutoriel, du moins ce que j'ai pu comprendre mais ça ne fonctionne pas:
https://www.webrankinfo.com/referencemen ... ctions.php
 
WRInaute discret
Quand je fais maintenant ça :
Code:
RewriteRule ^index.php?page=tag&t=([0-9a-zA-Z-]+)&p=([0-9]+)$ tags/$2/$1.html [R=301,L]
Je n'ai plus d'erreur 500 mais je n'obtient aucune redirection quand je visite une page du genre index.php?page=tag&t=test&p=1

Comment savoir quand ça fonctionne ? Est ce que en visitant la page plus haut le navigateur redirige vers la page tags/1/test.html et donc cette url s'affiche dans la barre de navigation ? Ou bien rien ne se passe mais les moteurs de recherche s'en rendent compte par je ne sais quel moyen ?

Merci
 
WRInaute passionné
il faut utiliser RewriteCond %{QUERY_STRING} et un paramètre "stop" pour éviter que ca boucle :
Code:
RewriteCond %{QUERY_STRING} ^page=tag&t=([0-9a-zA-Z-]+)&p=([0-9]+)$
RewriteRule ^index\.php$ tags/%2/%1.html? [R=301,L]

RewriteRule ^tags/([0-9]+)/([0-9a-zA-Z-]+)\.html$ index.php?page=tag&t=$2&p=$1&stop [L]
RewriteRule ^auteur/([0-9]+)/(.*)\.html$ index.php?page=author&author_name=$2&p=$1&stop [L]
 
WRInaute discret
webmasterlamogere a dit:
il faut utiliser RewriteCond %{QUERY_STRING} et un paramètre "stop" pour éviter que ca boucle :
Code:
RewriteCond %{QUERY_STRING} ^page=tag&t=([0-9a-zA-Z-]+)&p=([0-9]+)$
RewriteRule ^index\.php$ tags/%2/%1.html? [R=301,L]

RewriteRule ^tags/([0-9]+)/([0-9a-zA-Z-]+)\.html$ index.php?page=tag&t=$2&p=$1?stop [L]
RewriteRule ^auteur/([0-9]+)/(.*)\.html$ index.php?page=author&author_name=$2&p=$1?stop [L]

J'ai essayé avec ce que tu me suggère mais ça ne fonctionne pas, je suis redirigé vers :
h**p://www.monsite.com/srv/www/htdocs/web99/html/tags/1/formation.html

Sinon entre temps je suis parvenu à cette solution:

Code:
RewriteRule (.*) $1///%{QUERY_STRING} [C]
RewriteRule ^index.php///page=tag&t=([0-9a-zA-Z-]+)&p=([0-9]+)$ /tags/$2/$1.html? [R=301]

qui me redirige vers la page voulue mais malheureusement j'ai une erreur 500 !!!
 
WRInaute passionné
essaye en ajoutant des / devant le deuxième paramètre de RewriteRule :
Code:
RewriteCond %{QUERY_STRING} ^page=tag&t=([0-9a-zA-Z-]+)&p=([0-9]+)$
RewriteRule ^index\.php$ /tags/%2/%1.html? [R=301,L]

RewriteRule ^tags/([0-9]+)/([0-9a-zA-Z-]+)\.html$ /index.php?page=tag&t=$2&p=$1&stop [L]
RewriteRule ^auteur/([0-9]+)/(.*)\.html$ /index.php?page=author&author_name=$2&p=$1&stop [L]
 
WRInaute discret
La redirection fonctionne bien mais la page ne se charge pas et je recçois cette erreur: "Boucle de redirection"

Je te file mon .htaccess au cas où il y'aurai un conflit entre deux expressions:

Code:
# -FrontPage-

IndexIgnore .htaccess */.??* *~ *# */HEADER* */README* */_vti*

RewriteEngine on
RewriteRule ^category(.*).html$ index.php?page=category&category_id=$1 [L]
RewriteRule ^article(.*).html$ index.php?page=article&article_id=$1 [L]
RewriteRule ^tags/([0-9]+)/([0-9a-zA-Z-]+)\.html$ index.php?page=tag&t=$2&p=$1 [L]
RewriteRule ^auteur/([0-9]+)/(.*)\.html$ index.php?page=author&author_name=$2&p=$1 [L]
RewriteRule ^(.*).html$ index.php?pagedb=$1 [L]
RewriteRule ^index.html$ index.php

RewriteCond %{QUERY_STRING} ^page=tag&t=([0-9a-zA-Z-]+)&p=([0-9]+)$
RewriteRule ^index\.php$ /tags/%2/%1.html? [R=301,L]

RewriteRule ^tags/([0-9]+)/([0-9a-zA-Z-]+)\.html$ /index.php?page=tag&t=$2&p=$1&stop [L]
RewriteRule ^auteur/([0-9]+)/(.*)\.html$ /index.php?page=author&author_name=$2&p=$1&stop [L] 

<Limit GET POST>
order deny,allow
deny from all
allow from all
</Limit>
<Limit PUT DELETE>
order deny,allow
deny from all
</Limit>

ErrorDocument 404 /error404.php
ErrorDocument 403 /error404.php
ErrorDocument 401 /error404.php
ErrorDocument 500 /error404.php

En fait ne faut-il pas mettre [R=301, L] au lieu de [L] ?
 
WRInaute passionné
tu as laissé les anciennes réécritures. supprime ces deux lignes puisqu'il y a les même en dessous avec &stop :
Code:
RewriteRule ^tags/([0-9]+)/([0-9a-zA-Z-]+)\.html$ index.php?page=tag&t=$2&p=$1 [L]
RewriteRule ^auteur/([0-9]+)/(.*)\.html$ index.php?page=author&author_name=$2&p=$1 [L]
 
WRInaute discret
Bon ça fonctionne pour la page " tag", en faisant ceci:

Code:
RewriteCond %{QUERY_STRING} ^page=tag&t=([0-9a-zA-Z-]+)&p=([0-9]+)$
RewriteRule ^index\.php$ /tags/%2/%1.html? [R=301,L]

RewriteRule ^tags/([0-9]+)/([0-9a-zA-Z-]+)\.html$ /index.php?page=tag&t=$2&p=$1&stop [L]
RewriteRule ^auteur/([0-9]+)/(.*)\.html$ /index.php?page=author&author_name=$2&p=$1&stop [L]

Mais quand j'ajoute la page "author" rien ne fonctionne plus, voila ce que je fais:

Code:
RewriteCond %{QUERY_STRING} ^page=tag&t=([0-9a-zA-Z-]+)&p=([0-9]+)$
RewriteRule ^index\.php$ /tags/%2/%1.html? [R=301,L]

RewriteCond %{QUERY_STRING} ^page=author&author_name=(.*)&p=([0-9]+)$
RewriteRule ^index\.php$ /auteur/%2/%1.html? [R=301,L]

RewriteRule ^tags/([0-9]+)/([0-9a-zA-Z-]+)\.html$ /index.php?page=tag&t=$2&p=$1&stop [L]
RewriteRule ^auteur/([0-9]+)/(.*)\.html$ /index.php?page=author&author_name=$2&p=$1&stop [L] 

RewriteRule ^(.*).html$ index.php?pagedb=$1 [L]
RewriteRule ^index.html$ index.php

Une idée ?
En tout cas merci beaucoup pour ton aide, grace à toi j'y suis presque :)
 
WRInaute passionné
il manque un rewriterule :
Code:
RewriteCond %{QUERY_STRING} ^page=tag&t=([0-9a-zA-Z-]+)&p=([0-9]+)$
RewriteRule ^index\.php$ /tags/%2/%1.html? [R=301,L]
RewriteCond %{QUERY_STRING} ^page=author&author_name=(.*)&p=([0-9]+)$ 
RewriteRule ^index\.php$ /auteur/%2/%1.html? [R=301,L]

RewriteRule ^tags/([0-9]+)/([0-9a-zA-Z-]+)\.html$ /index.php?page=tag&t=$2&p=$1&stop [L]
RewriteRule ^auteur/([0-9]+)/(.*)\.html$ /index.php?page=author&author_name=$2&p=$1&stop [L]
 
WRInaute discret
J'ai pas très bien compris, pourrais-tu me montrer un exemple ou bien me montrer directement ce que je dois mettre à la place ?

Merci.

Edit: Ok j'ai compris :)
 
WRInaute discret
Bon j'ai fais ce tu m'a demandé càd:

Code:
RewriteCond %{QUERY_STRING} ^page=author&author_name=(.*)&p=([0-9]+)$
RewriteRule ^index\.php$ /auteur/%2/%1.html? [R=301,L]
RewriteRule ^auteur/1/(.*)\.html$ /index.php?page=author&author_name=$1&stop [L]
J'ai mis auteur/1/ parce que j'ai mis en place la pagination que récement et que mes pages indexées dans google ne tiennent que sur une seule page (la première).
Seulement ça ne fonctionne pas.

Donc pour faire simple, les pages sous forme:
/index.php?page=author&author_name=nometprenom
doivent êtres redirigées vers:
/auteur/1/nometprenom.html

Merci encore une fois
 
WRInaute passionné
tu ne fait pas beaucoup d'effort ;)
Code:
RewriteCond %{QUERY_STRING} ^page=author&author_name=(.*)$
RewriteRule ^index\.php$ /auteur/1/%1.html? [R=301,L]
RewriteRule ^auteur/1/(.*)\.html$ /index.php?page=author&author_name=$1&stop [L]
 
WRInaute discret
webmasterlamogere a dit:
tu ne fait pas beaucoup d'effort ;)
Code:
RewriteCond %{QUERY_STRING} ^page=author&author_name=(.*)$
RewriteRule ^index\.php$ /auteur/1/%1.html? [R=301,L]
RewriteRule ^auteur/1/(.*)\.html$ /index.php?page=author&author_name=$1&stop [L]
Tu sais pour moi les regex et tout ce qui s'y rattache c'est presque du chinois, je fais de mon mieux pour comprendre, et j'avoue que depuis peu je progresse, mais ce n'est pas toujours facile.

Bon, si je fais ce que tu suggère maintenant je ne pourrais plus accèder aux pages:
auteur/2/nometprenom.html
que ce soit la page 2, 3 ou toute autre page qui ne soit pas la première.

Donc pour récapituler, je veux pouvoir réécrire:
/index.php?page=author&author_name=$1
en
auteur/1/$1.html

Et en même temps réécrire:
/index.php?page=author&author_name=$1&p=$2
en
auteur/$2/$1.html

Tout ce que je peux faire maintenant, c'est soit l'une soit l'autre mais pas les deux.
Encore merci pour ta patience, avec toi j'ai beaucoup appris :) et je t'en suis reconnaissant.
 
WRInaute passionné
si je récapitule toutes les règles tu dois avoir :
Code:
#redirections avec page
RewriteCond %{QUERY_STRING} ^page=tag&t=([0-9a-zA-Z-]+)&p=([0-9]+)$
RewriteRule ^index\.php$ /tags/%2/%1.html? [R=301,L]
RewriteCond %{QUERY_STRING} ^page=author&author_name=(.*)&p=([0-9]+)$
RewriteRule ^index\.php$ /auteur/%2/%1.html? [R=301,L]
#redirections sans page
RewriteCond %{QUERY_STRING} ^page=author&author_name=(.*)$
RewriteRule ^index\.php$ /auteur/1/%1.html? [R=301,L]
RewriteCond %{QUERY_STRING} ^page=author&author_name=(.*)$
RewriteRule ^index\.php$ /auteur/1/%1.html? [R=301,L]
#réécritures
RewriteRule ^tags/([0-9]+)/([0-9a-zA-Z-]+)\.html$ /index.php?page=tag&t=$2&p=$1&stop [L]
RewriteRule ^auteur/([0-9]+)/(.*)\.html$ /index.php?page=author&author_name=$2&p=$1&stop [L]
 
WRInaute discret
Erreur : "Boucle de redirection" quand j'appel une page sans page et je suis rediriger vers une page dure:
h**p://www.articlesenligne.com/auteur/1/nometprenom&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop&p=1&stop.html
 
WRInaute discret
Non j'ai bien inclus le "?" mais boucle toujours.

J'ai décidé de rediriger tous vers la première page et attendre que google prenne en compte mes nouvelles pages pour ajouter la pagination. Donc si je fais ça:
Code:
RewriteCond %{QUERY_STRING} ^page=tag&t=([0-9a-zA-Z-]+)$
RewriteRule ^index\.php$ /tags/1/%1.html? [R=301,L]

RewriteCond %{QUERY_STRING} ^page=author&author_name=(.*)$
RewriteRule ^index\.php$ /auteur/1/%1.html? [R=301,L]

RewriteRule ^tags/1/([0-9a-zA-Z-]+)\.html$ /index.php?page=tag&t=$1&stop [L]
RewriteRule ^auteur/1/(.*)\.html$ /index.php?page=author&author_name=$1&stop [L]

Les pages "tag" marchent bien mais les pages "author" me renvoient toujours la même erreur qu'hier.

Je commence vraiment à perdre patience, ça fait 2 jours que je me bat avec ce truc qui ne veux pas fonctionner, j'espère que tu trouvera la provenance du problème parce que moi je ne capte plus rien :(
 
WRInaute passionné
je crois que c'est le (.*) dans le pattern du query string qui match aussi &stop
essaye de remplacer . par [^&] :
Code:
#redirections avec page
RewriteCond %{QUERY_STRING} ^page=tag&t=([0-9a-zA-Z-]+)&p=([0-9]+)$
RewriteRule ^index\.php$ /tags/%2/%1.html? [R=301,L]
RewriteCond %{QUERY_STRING} ^page=author&author_name=([^&]*)&p=([0-9]+)$
RewriteRule ^index\.php$ /auteur/%2/%1.html? [R=301,L]
#redirections sans page
RewriteCond %{QUERY_STRING} ^page=author&author_name=([^&]*)$
RewriteRule ^index\.php$ /auteur/1/%1.html? [R=301,L]
RewriteCond %{QUERY_STRING} ^page=author&author_name=([^&]*)$
RewriteRule ^index\.php$ /auteur/1/%1.html? [R=301,L]
#réécritures
RewriteRule ^tags/([0-9]+)/([0-9a-zA-Z-]+)\.html$ /index.php?page=tag&t=$2&p=$1&stop [L]
RewriteRule ^auteur/([0-9]+)/(.*)\.html$ /index.php?page=author&author_name=$2&p=$1&stop [L]
 
WRInaute discret
Merci j'ai trouvé de mon coté aussi une solution. J'ai remplacé (.*) par ([a-zA-Z0-9%-]+) ce qui revient au même, du moins je le pense.

Maintenant tout fonctionne très bien, et je t'en remercie car sans toi je ne m'en serai pas sorti de sitôt.

J'ai cependant un autre petit problème qui consiste en l'écriture des urls. Pour faire simple je vais donner un exemple.

J'ai l'url qui se réécrit avec l'url rewtitting de cette façon:
h**p://www.articlesenligne.com/auteur/1/Cl%E9ment.html
Mais avec un lien direct que j'ai créé sur mon site (en appliquant un urlencode) l'url s'écrit de cette façon:
h**p://www.articlesenligne.com/auteur/1/Cl%25E9ment.html

J'ai fait une petite recherche et il en sort que l'accent est encodé en hexa pour le premier cas, et pour le deuxième cas il est encodé une fois ensuite le signe "%" est réencodé ce qui donne %25E9.
J'aurai donc deux questions:

1- Est ce que pour Google & co ces deux urls sont identiques ?
2- Est ce qu'il y'a une solution pour avoir la même écriture pour ces deux urls ? Ou plutot, est il possible d'écrire une regex à l'intérieur du .htacces qui s'occuperait de ça ?

Merci.
 
Discussions similaires
Haut