modifier un url rewriting

WRInaute discret
Bonjour à tous,

Je reviens vers mon bon vieux WRI, après mes errements du début.
Je me retrouve avec des url un peu moches et longues :

http://www.enseignons.be/secondaire/pre ... -1456.html

Je voudrais en faire des url plus courtes, mais aimerais garder le référencement qui a été établi.

Que dois-je inscrire dans le rewriting pour rediriger les visiteurs de manière
permanente d'une ancienne url rewritée à la nouvelle ?
 
WRInaute occasionnel
Soit avec RedirectPermanent ... (Necessite d'ecrire tout les liens)

Soit avec RedirectMatch 301 ... (Peut utiliser les expression regulière)

Soit avec RewriteRule ... [R=301] (Tu dois connaitre :) )

Soit via ton script PHP (Pratique si tu as besoin de cherché des info dans une base de donnée pour inclure des mots clef, etc...)

Les solutions sont vaste, tout dépand des URL de départ et d'arrivé.
 
WRInaute discret
Tu as des liens d'explications pour chacune de ces méthodes ?
Quand tu dis écrire tous les liens, c'est chaque url où le rewriting fait son effet ??? C'est trop lourd ça

Je peux faire deux rewriterule ? ?
viewtopic.php?t=$1 topic-$1.html
topic-$1.html vers sujet-$1.html ???

Que veux-tu dire quand tu dis "via ton script php" ?? L'idée est de ne pas perdre le référencement sur les pages existants déjà, comment serait-ce possible via le script ??

Merci de ces précisions
 
WRInaute occasionnel
nizouille a dit:
Tu as des liens d'explications pour chacune de ces méthodes ?
Pour les trois première, je te renvoi à la doc Apache
http://httpd.apache.org/docs/1.3/mod/mo ... directperm
http://httpd.apache.org/docs/1.3/mod/mo ... irectmatch
http://httpd.apache.org/docs/1.3/mod/mo ... ewriteRule
C'est la vesion anglaise, mais ça se trouve en FR

nizouille a dit:
Quand tu dis écrire tous les liens, c'est chaque url où le rewriting fait son effet ??? C'est trop lourd ça
Après relecture, laisse tomber cette solution car elle ne marchera pas.

nizouille a dit:
Je peux faire deux rewriterule ? ?
viewtopic.php?t=$1 topic-$1.html
topic-$1.html vers sujet-$1.html ???
Dans mon idée, tu commence dabort par créer ton nouveau rewrite, une fois qu'il fonctionne (sur un serveur de test) tu cherche comment faire pour passé de l'ancien rewrite vers le nouveau.
Donc si par example :
Ancienne URL : -http://.../preparations-secondaire-29-5-argumentation-blalbla.html
Nouvelle URL : -http://.../topic-29-5.html
OU
Ancienne URL : -http://.../truc-chose-43-8-pipo-blabla-truc.html
Nouvelle URL : -http://.../topic-43-8.html
C'est à dire que les nouvelle URL ne possède aucune info qui ne puisse être trouvé dans l'ancienne URL ou qui ne soit standard a toute les URL.
Dans ce cas tu peut partir sur du RewriteRule ou du RedirectMatch (RedirectMatch me paret plus indiqué à cause du contexte mais RewriteRule fonctionnera aussi)
Sinon, tu peut passer par ton script PHP (Voir reponse d'après)
nizouille a dit:
Que veux-tu dire quand tu dis "via ton script php" ?? L'idée est de ne pas perdre le référencement sur les pages existants déjà, comment serait-ce possible via le script ??
Le principe est simple. ton ancien et ton nouveau rewrite aboutise sur le même fichier, donc tu met en place ton nouveau rewrite et tu garde le ancienne règle. Donc quand quelqu'un arrive sur une page via une ancienne URL tu rewrite vers le bon fichier comme ça à toujours fonctionné. Mais au début de ton script, tu test pour voir si le visiteur est arrivé sur cette page avec l'ancienne URL ou la nouvelle ($_SERVER['REQUEST_URI']) et si c'est l'ancienne, tu redirige vers la nouvelle URL (header("HTTP/1.1 301 Moved Permanently"); header('Location: ' . $nouvelle_url_rewriter); )

J'ai toujours de la peine à être clair dans mes explications, mais le coup du PHP, je l'utilise en prod pour verifé qu'il n'y a pas de faute d'orthographe dans mes URL et si c'est le cas je rediriges vers la bonne URL.
Exemple :
-http://www.coutellerie.ch/swiss-champ-xavt--p705.php (URL corecte)
-http://www.coutellerie.ch/welcome-to-wri--p705.php (URL pas corecte, donc redirigé vers la première car seul le "p705" est important)

N'hésite pas si tu as des question.
 
WRInaute discret
Je n'hésite pas, vu le nombre de questions que je me pose

Le problème est qu'il y a parfois des éléments de mon ancienne url qui disparaissent dans la nouvelle ... Parfois des nouveaux éléments dans la nouvelle url ..


Comment puis-je faire ?

RedirectMatch ^preparations-fondamental-([0-9]+{1})-(.+{2})-([0-9]+{3}).html$ http://localhost/fondamental/preparations-$1-$2-$3.html
RewriteRule preparations-([0-9]+)-(.+)-([0-9]+)\.html$ preparations.php?id_cours=$1&titre=$2&iddoc=$3

Ca ne fonctionne pas ... Je m'y connais très peu en regexp

Merci de votre aide !
 
WRInaute occasionnel
nizouille a dit:
Le problème est qu'il y a parfois des éléments de mon ancienne url qui disparaissent dans la nouvelle ... Parfois des nouveaux éléments dans la nouvelle url ..


Comment puis-je faire ?
Si c'est trop complexe (ex: lectur d'information dans un base de données) je gererais ça dans un script PHP. genre une regle pour l'ancienne URL vers un fichier qui lui traitera les info qu'il reçois et qui complétera si besoin les information manquante et qui redirigera vers la nouvelle URL.
nizouille a dit:
RedirectMatch ^preparations-fondamental-([0-9]+{1})-(.+{2})-([0-9]+{3}).html$ http://localhost/fondamental/preparations-$1-$2-$3.html
RewriteRule preparations-([0-9]+)-(.+)-([0-9]+)\.html$ preparations.php?id_cours=$1&titre=$2&iddoc=$3
Je supose que tu as une erreur 500 ?
Et comme ça :
Code:
RedirectMatch ^preparations-fondamental-([0-9]+)-(.+)-([0-9]+)\.html$ http://localhost/fondamental/preparations-$1-$2-$3.html
RewriteRule preparations-([0-9]+)-(.+)-([0-9]+)\.html$ preparations.php?id_cours=$1&titre=$2&iddoc=$3
 
WRInaute discret
RewriteRule preparations-fondamental-([0-9]+)-(.+)-([0-9]+).html$ preparations-$1-$2-$3.html [R=301]
RewriteRule preparations-([0-9]+)-(.+)-([0-9]+)\.html$ preparations.php?id_cours=$1&titre=$2&iddoc=$3


Finalement, j'y arrive avec ceci ...


MAIS, dès qu'il y a une information supplémentaire :
Ex :
http://www.enseignons.be/fondamental/co ... al-18.html
qui devrait devenir si tout se passe bien :

http://www.enseignons.be/fondamental/co ... is-18.html

ça je n'y arrive pas ... Peux-tu m'aider ?


Par ailleurs, j'ai aussi du mal quand je dois supprimer une information qui se trouve non pas en début d'url (j'utilise alors l'astuce de passer la variable dans le nom : preparations-fondamental ). Mais dans des cas où la variable est au milieu du schmilblick des variables et que c'est justement elle que je dois enlever, là ça coince :(

Merci de ton aide précieuse (et merci de valider le code que j'ai mis là-dessus)
Benjamin

Benjamin
 
WRInaute discret
Tu aurais un exemple de script pour gérer l'ajout d'informations, ou un début d'explications, que j'essaie d'explorer ça sur une bonne base ?

Je suppose que tu utililiserais le header:Location, etc.

Toute info m'aidera, merci beaucoup
Benjamin
 
WRInaute occasionnel
Il n'y a malheureusement pas de solution "clef en main" mais je vais essayer de t'éclairer comme je peu.

1)
Pour le code que tu donnes, il a l'air bon (d'un point de vu syntaxique) et ne devrais normalement pas te donner d'erreur 500.
J'apportérais juste une modif sur "...([0-9]+).html$ pre..." en ajoutant un "\" devant le point du ".html" soit "...([0-9]+)\.html$ pre...". Ca marche sans, mais je pense que c'est une bonne habitude à prendre. :D

2)
Pour :
MAIS, dès qu'il y a une information supplémentaire :
Ex :
-http://www.enseignons.be/fondamental/cours-fondamental-18.html
qui devrait devenir si tout se passe bien :

-http://www.enseignons.be/fondamental/cours-francais-18.html

ça je n'y arrive pas ... Peux-tu m'aider ?
Je pense qu'il te faud un script PHP si tu veux traité les lien de manière dynamique.
Si tu me donne la version NON rewrité des ses deux liens, je pourrais peut-être approfondire.

3)
Par ailleurs, j'ai aussi du mal quand je dois supprimer une information qui se trouve non pas en début d'url (j'utilise alors l'astuce de passer la variable dans le nom : preparations-fondamental ). Mais dans des cas où la variable est au milieu du schmilblick des variables et que c'est justement elle que je dois enlever, là ça coince
Je vais prendre un exemple:
Ancien lien : -http://www.enseignons.be/fondamental/cours-francais-18.html
Nouveau lien : -http://www.enseignons.be/fondamental/cours-18.html
Dans ce cas je verais une règle style :
Code:
RewriteRule /(.+)/cours-.+-([0-9]+)\.html /$1/cours-$2.html [R=301,L]
OU
Code:
RewriteRule /fondamental/cours-francais-18\.html /fondamental/cours-18.html [R=301,L]
Mais dans ce cas, c'est une règle par lien existant ...
Code:
RewriteRule /fondamental/cours-francais-18\.html /fondamental/cours-18.html [R=301,L]
RewriteRule /fondamental/cours-francais-19\.html /fondamental/cours-19.html [R=301,L]
RewriteRule /fondamental/cours-francais-20\.html /fondamental/cours-20.html [R=301,L]
...
pas terrible comme solution, mais ça peut dépanner.
Donne mois un exemple concret qui te pose problème, se serra plus simple.
 
WRInaute discret
Pour la version non-rewritée :

Ancien lien :

RewriteRule cours-(.+)-([0-9]+)\.html$ cours.php?niveau=$1&id_cours=$2

ce qui donne : http://www.enseignons.be/fondamental/co ... al-18.html

Ce que j'aimerais

http://www.enseignons.be/fondamental/co ... is-18.html

Mon nouveau rewrite :
RewriteRule cours-(.+)-([0-9]+)\.html$ cours.php?cours=$1&id_cours=$2


------------------

Pour ce qui est de l'exemple concret de ce qui me pose problème :
URL actuelle :

http://www.enseignons.be/secondaire/res ... 5-4-0.html

URL désirée :
http://www.enseignons.be/secondaire/res ... 9-4-0.html

Suppression de $niveau (secondaire), ça j'applique la règle ci-dessus
Mais pour supprimer $intitule (5) (dans ma redirection toujours), ça c'est la merdouille ...

Merci beaucoup beaucoup beaucoup pour ton assistance ...
 
WRInaute discret
Par ailleurs, pour la soluce handmade, c'est un peu bof, parce que il y a plus de 60 liens comme ça ... :(

Tu aurais un début de script pour le header location ? J'ai un peu cherché, mais rien trouvé de très concret ...

J'espère que j'abuse pas trop.
 
WRInaute occasionnel
1)
OK c'est plus clair avec un exemple, merci

Je dirais qu'au niveau htaccess tu as une règle valable pour les nouvelle et ancienne URL.
Code:
RewriteRule cours-(.+)-([0-9]+)\.html$ cours.php?cours=$1&id_cours=$2 [L]
Puis dans "cours.php" au tout debut il faud que tu test la variable "cours" et tu détermine si ça valeur est correct, c'est dire qu'elle vaut "francais" ou autre mais pas "fondamental" ou autre. Pour que ça fonctionne sans problème, il faud être sûr que "cours" ne soit jamais egale à une valeur que pouvait avoir "niveau".
Ensuite si le test est OK et que c'est donc une des nouvelle URL, tu continus ton script normalement mais si le test est pas OK et que "cours" à enfaite une valeur de "niveau" dans ce cas tu crée la nouvelle URL valide et ensuite tu utilise la fonction php "header()".
Code:
header('HTTP/1.1 301 Moved Permanently'); // Indique la redirection
header('Location: http://www.enseignons.be/fondamental/cours-francais-18.html'); // Indique l'URL sur laquelle rediriger

2)
Je dirais que sa, ça devrais faire l'affaire :
Code:
RewriteRule /(.+)/ressources-.+-([0-9]+)-[0-9]+-([0-9]+)-([0-9]+)\.html /$1/ressources-$2-$3-$4.html [R=301,L]
 
WRInaute discret
Donc en fait, pour supprimer une variable, il suffit de ne pas la mettre entre parenthèses ?

J'essaie de comprendre :)
 
WRInaute occasionnel
nizouille a dit:
Donc en fait, pour supprimer une variable, il suffit de ne pas la mettre entre parenthèses ?

J'essaie de comprendre :)
Les parenthèses ne serve qu'à faire des retro-reférence (les fameux $1, $2, $3, etc.) Donc si tu les mets, il suffis de sauter les retro-reférence dont tu n'as as besoin :
Code:
RewriteRule /(.+)/ressources-(.+)-([0-9]+)-([0-9]+)-([0-9]+)-([0-9]+)\.html /$1/ressources-$3-$5-$6.html [R=301,L]
Ca marchera aussi, mais si c'est pour ne pas en utiliser certaine, au temps ne pas les déclarer (avec des parenthèses)
 
WRInaute discret
MERCI MERCI MERCI !!
Tu es le couteau suisse de l'url rewriting ;)

Plus sérieusement, on peut voir avec webdeveloper de firefox, ou avec l'outil pour les header de webrankinfo si le 301 est pris en compte, mais peut-on vérifier la destination du lien (histoire d'en avoir le coeur net :) )

Comme il n'y a pas de script php, je suppose que c'est normal que l'adresse dans la barre d'adresse du navigateur ne se modifie pas.

Je me trompe ?
 
WRInaute occasionnel
nizouille a dit:
MERCI MERCI MERCI !!
Tu es le couteau suisse de l'url rewriting ;)
Merci ;)

nizouille a dit:
Plus sérieusement, on peut voir avec webdeveloper de firefox, ou avec l'outil pour les header de webrankinfo si le 301 est pris en compte, mais peut-on vérifier la destination du lien (histoire d'en avoir le coeur net :) )
Tu as normalement la destination dans le header
HTTP/1.1 301 Moved Permanently
Date: Sun, 27 Aug 2006 10:57:08 GMT
Server: Apache
Set-Cookie: osCsid=365ba4375e880a1015579157557e36d
5; path=/; domain=coutellerie
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
, post-check=0, pre-check=0
Pragma: no-cache
Location: h**p://www.coutellerie.ch/nail-clip-580--p747.php?osCsid=365ba4375e880a1015579157557e36d5
Connection: close
Content-Type: text/html

nizouille a dit:
Comme il n'y a pas de script php, je suppose que c'est normal que l'adresse dans la barre d'adresse du navigateur ne se modifie pas.
C'est possible :? A voir une fois tout fini pour être sûre.
 
Discussions similaires
Haut