URL Rewriting et redirection : comment allier les deux ?

Eléphant du PHP | 57 Messages

18 sept. 2010, 11:44

Bonjour,

J'ai cette ligne dans mon .htacces qui me permet d'afficher dans le navigateur une url de type http://e-storia.info/dossier/individu/Barack_Obama-1-1 :

Code : Tout sélectionner

RewriteRule ^dossier/([A-Za-z]{4,12})/([0-9A-Za-z_()&-]{2,100})-([0-9]+)-([0-9]+)$ dossier.php?type=$1&nom=$2&id=$3&page=$4 [L]
Je suis en ce moment occupé à optimiser le référencement du site et je souhaite donc supprimer la duplication du contenu (les pages http://e-storia.info/dossier/individu/Barack_Obama-1-1 et http://e-storia.info/dossier.php?type=i ... d=1&page=1 renvoient à la même page).

Est-ce que quelqu'un aurait la gentillesse de m'indiquer ce que je dois rajouter à mon .htaccess pour que toutes les pages pointant vers une url de type "http://e-storia.info/dossier.php?type=i ... d=1&page=1" renvoient vers une url de type "http://e-storia.info/dossier/individu/Barack_Obama-1-1" ?

Merci :)

ViPHP
ViPHP | 5462 Messages

18 sept. 2010, 12:21

ca marche pas dans se sens la, c'est dans ton code que tu dois formater les liens :wink:

Eléphant du PHP | 57 Messages

18 sept. 2010, 12:24

Que veux-tu dire par la ?
Dans mon code mes liens renvoient vers des url formatés de type "/dossier/individu/barack_obama-1-1" mais ca n'empeche que les url dossier.php?type=individu&nom=barack_obama&id=1&page=1 existent. J'aimerais que ce dernier format renvoit automatiquement vers le premier, c'est possible ?

ViPHP
ViPHP | 5462 Messages

18 sept. 2010, 12:48

Que veux-tu dire par la ?
Dans mon code mes liens renvoient vers des url formatés de type "/dossier/individu/barack_obama-1-1" mais ca n'empeche que les url dossier.php?type=individu&nom=barack_obama&id=1&page=1 existent. J'aimerais que ce dernier format renvoit automatiquement vers le premier, c'est possible ?
non
dossier.php?type=individu&nom=barack_obama&id=1&page=1 existera toujours

faut penser comme si le rewriting c'était un raccourcis, y'aura toujours le fichier de base et tu pourra toujours l'ouvrir par son vrai nom

Eléphant du PHP | 57 Messages

18 sept. 2010, 13:04

Oui, la page existera toujours, mais je souhaiterais simplement une redirection 301. Pour que lorsque l'on arrive sur la page dossier.php?type=individu&nom=barack_obama&id=1&page=1 (qui existera toujours, je suis bien d'accord) on soit redirigé vers /dossier/barack_obama-1-1

C'est normalement possible, dixit le tutorial de webrankinfo :

"Erreur n°4 : avoir 2 types d'URL indexables (réécrites et classiques)

Imaginons que vous veniez de mettre en place la réécriture d'URL (URL Rewriting) sur votre forum. Pour reprendre l'exemple précédent, les URL de pages de discussion sont passées de www.example.com/topic.php?t=456 à www.example.com/topic-456.html. Avez-vous vérifié que vous interdisez l'indexation des pages avec l'ancien format d'URL ? D'ailleurs la meilleure solution dans ce cas est même de rediriger de façon permanente (code 301) chaque page à l'ancien format vers la page équivalente avec le nouveau format."

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

18 sept. 2010, 15:35

Je ne l'ai pas essayé, mais il me semble que tu peux détecter en php si l'url qui a permit d'ouvrir la page est celle ré-écrite, ou l'url réelle du script php (ex avec $_SERVER['REQUEST_URI']).

A partir de là, si l'url utilisée n'est pas celle ré-écrite tu rediriges l'utilisateur vers celle-ci avec un header avant tout traitement :
header("HTTP/1.1 301 Moved Permanently");
header("Location: ....");
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 57 Messages

18 sept. 2010, 15:39

J'ai essayé ceci, inséré tout en haut de ma page dossier.php :

Code : Tout sélectionner

if (preg_match("#/dossier\.php$#", $_SERVER['REQUEST_URI'])) { $url = 'http://e-storia.info/dossier/'.$_GET['type'].'/'.$_GET['nom'].'-'.$_GET['id'].'-'.$_GET['page']; header("Status: 301 Moved Permanently", false, 301); header("Location: ".$url); }
mais ca ne marche pas :(

Eléphant du PHP | 57 Messages

18 sept. 2010, 16:41

En fait ca marche, me suis gourré dans le regex xD

Code : Tout sélectionner

if (preg_match("#^/dossier\.php#", $_SERVER['REQUEST_URI'])) { $url = 'http://e-storia.info/dossier/'.$_GET['type'].'/'.$_GET['nom'].'-'.$_GET['id'].'-'.$_GET['page']; header("Status: 301 Moved Permanently", false, 301); header("Location: ".$url); }