URL rewriting pour les nuls

WRInaute occasionnel
Hello,

C'est sans doute moi mais je n'ai pas trouvé de tutoriel pour les Rewrite Rules sur le site. Je vous propose donc le mien. Vous verrez c'est etonnament facile.


Principe:
L'url rewriting permet d'utiliser des
urls toute simples au lieu d'url longues et complexes

maPage-val1-val2-val3.html

à la place de

maPage.php?var1=val1&var2=val2&var3=val3

IL NE FAIT PAS LA TRANSFO AUTOMATIQUE DE

maPage.php?var1=val1&var2=val2&var3=val3

EN

maPage-val1-val2-val3.html

Vous devez vous meme modifier l'ecriture des URL DANS VOTRE CODE SOURCE.



Avantages:
Les bots suivront les liens simplifiés et indexeront votre site en
profondeur. Traitement qui etait réservé avec les URL dynamiques que pour les gros sites à haut PR

Inconvénients:
Il faut un serveur à la hauteur - car cela consomme en ressource.
Il faut réécrire les liens dans ses pages.

Comment ca marche?
Vous devez ajouter les regles de réecriture dans le fichier .htaccess
et activer le mod
ex:


RewriteEngine on
RewriteRule \photo-([0-9]+)\.html$ /photo.php?id=$1


Et réecrire vos liens dans vos pages.

L'url rewriting décortiqué:
D'abord il faut identifier les liens que vous allez réecrire:
Comme je suis photographe j'ai un site qui gére des photos, des albums
(appelés event) et des portfolios. Chacunes de ces pages sont à la racine (optimisation google)


portfolio.php?part=2
portfoliodetail.php?id=41&part=2
portfoliodetail.php?part=2&order=22
event.php?id=20
photo.php?id=527
photo.php?next=527&event=20
photo.php?prev=528&event=20
index.php?language=FR


Dès que vous avez listé les URL vous devez concevoir le format des nlles
URLs. Elles deviennent donc:

portfolio-2.html
portfoliodetail-id-41-22.html
portfoliodetail-order-2-22.html
event-20.html
photo-527.html
photo-next-527-20.html
photo-prev-528-20.html
indexFR.html


L'etape suivante consiste à modifier vos codes sources pour transformer vos url en url simplifiées. Le mod d'url rewriting lui se chargera de transformer les url simplifiées en url dynamiques. Ensuite aller dans le .htaccess pour specifier les rewrite rules.

Ajouter les regles de réecriture dans le .htaccess

la 1ere concerne le portfolio.php
RewriteRule \portfolio-([0-9]+)\.html$ /portfolio.php?part=$1

\ est un caractere d'echappement qui indique un pattern à rechercher dans l'URL: ici portfolio- et .html

([0-9]+) indique une suite de chiffres qui sera placée dans une variable

$ cloture la chaine de caracteres à retrouver

/ debute la réécriture

$1 la premiere variable - correspond ici à la suite de chiffres


La 2eme url est plus complexe elle contient 2 paramétres $1 et $2

RewriteRule \portfoliodetail-id-([0-9]+)\-([0-9]+)\.html$
/portfoliodetail.php?id=$1&part=$2

....

Je laisse les autres regles de réécriture en exercice et je passe
directement à la dernière :wink:

RewriteRule \index(.+)\.html$ /index.php?language=$1

Ou . est un joker comme * en dos


Les options [] entre crochets

[L] plus de réecriture

ex
rewrite rule (.*)\.htm $1.jsp [L]
rewrite rule (.*)\.jsp $1.truc

transforme les fichiers html en jsp
et les jsp en truc

sans la directive L on n'aurait que des fichiers truc





[R] option de redirection
[R=301] redirection permanente
[R=302] redirection temporaire

ex:
RewriteRule \index(.+)\.html$ /index.php?language=$1 [R=permanent]


[QSA]
tenir compte de la query
permet de faire photo-527.html?language=FR

ex

RewriteRule \photo-([0-9]+)\.html$ /photo.php?id=$1 [QSA]



On peut combiner pls options ce qui donne par exemple [QSA,L]


BON A SAVOIR:

Il est inutile de réecrire les url pour les formulaires: les bots ne font pas d'envoi de formulaire.


Voila j'espère que vous y voyez plus clair qu'au début du post.
 
WRInaute discret
Une des choses les plus tordues à assimiler avec l'url rewriting - quand on commence - c'est que en fait ca ne réécrit pas exactement les url dans nos pages.

Il faut soit même changer les url dans les fichiers, et c'est quand elles sont cliquées (ou tapées dans la barre d'adresse) que le serveur se charge alors d'interpréter les règles de réécriture et changer ce qui lui est envoyé dans le format que php saura lire.

Par exemple forums/viewtopic_32396.htm est afffiché sur les pages du forum parce que le code du forum a été modifié. Au lieu d'afficher viewtopic.php?id=$id, on affiche viewtopic_$id.html

Quand l'url arrive au serveur, lui il fait "ok ca contient viewtopic_$1.html je sais que ca signifie que je dois prendre la variable $1 et l'utiliser comme si c'était $id et viewtopic_ veut dire que c'est viewtopic.php?id=

Je me permet cette précision car c'est ce que j'ai eu du mal à assimiler au départ, et tous ceux à qui j'en ai parlé avaient un peu le même problèmes ^^ "ah bon, ca change pas les url dans mes fichiers ? ca pue ton truc" :D
 
WRInaute impliqué
C'est pas gérable au niveau de ton php de lui indiquer directement photo-526.html et photo-528.html sur la page photo-527.html en lieu et place des liens.
Car après tout tu connais le numéro de la photo précédente et suivante.
 
WRInaute occasionnel
cybervince a dit:
C'est pas gérable au niveau de ton php de lui indiquer directement photo-526.html et photo-528.html sur la page photo-527.html en lieu et place des liens.
Car après tout tu connais le numéro de la photo précédente et suivante.

seulement si je ne change pas si je ne retire pas de photos de l'album et que je n'en rajoute pas. Des que je rajoute une photo elle prend l'id disponible suivant ca pourait etre 528 comme 672. Les photos entre appartenant à d'autres albums. Les photos ne sont pas triées dans un ordre particulier dans les albums.

et merci pour m'avoir ouvert les yeux sur le bidule :mrgreen:
 
WRInaute impliqué
Le mod d'url rewriting lui se chargera de transformer les url simplifiées en url dynamiques. Ensuite aller dans le .htaccess pour specifier les rewrite rules.

tu parle de mod d'url rewriting que ve tu dire par la ou tu parle simplement de la configuration des url dans le fichier .htaccess ?!
 
WRInaute passionné
Qund vous faites des tutoriels sur la réécriture d'URL, ça serait sympa de préciser aux débutants qu'il y a des pages absolument inutiles à réécrire (résultats de formulaire...) et que l'UR n'est pas magique (ne peut pas faire rewriterule index.php?a=b index-a-b.html) et que un .php ou un .html ça ne change rien du tout (qu'il est stupide de faire une règle du genre redirect (.*).php $1.html)

Parce que ce sont des erreurs très fréquentes et ça devient lassant de toujours répéter la même chose.
 
WRInaute accro
C'est pour cela que les forums existe ! :wink:

pour partager le savoir et donc pouvoir y répondre...

pour la première j'y est répondu...(relire au dessus)
à qui (personne n'est visé particuièrement, mais si un utilisateur malin cherche un script.php ca peut le potéger oui ok normalement s'il est bien fait pas de pb...) enfin ca je l'ai aussi di au dessus............

comment ? (ca par contre faut partager les connaissances...)
j'attends the best....je suis pas encore tombé dessus ! héhé
 
WRInaute passionné
(relire au dessus)
je ne vois rien dans ce sujet.
tu veux les interdire, je te demande pourquoi, tu me réponds "pour les interdire" :?

à qui ? à personne en particulier :?

comment ? tu ne sais pas...

je trouve ça un peu léger comme motivations pour la perte de temps que ça occasionne :lol:
 
WRInaute accro
pourquoi:

multiple raison (dont certaine que je dois encore ignoré...)

- l'utilisateur ne saura pas comment est géré le site... (php, asp...)

- évite de tomber sur un script existant qui peux créer des problèmes/erreur

a qui : (personne en particulier je confirme...)
pour être plus précis...je parle d'un utilisateur....d'où le "personne en particulier" !

comment: oui la je suis léger ! d'où la question sur le forum...
maintenant si tu ne sais pas je comprends que tu ne puisse répondre clairement à ma question...
de plus si cela représente un perte de temps, je ne te force en aucun cas à répondre.....

:wink:
 
WRInaute occasionnel
Dj_Apx a dit:
Qund vous faites des tutoriels sur la réécriture d'URL, ça serait sympa de préciser aux débutants qu'il y a des pages absolument inutiles à réécrire (résultats de formulaire...) et que l'UR n'est pas magique (ne peut pas faire rewriterule index.php?a=b index-a-b.html) et que un .php ou un .html ça ne change rien du tout (qu'il est stupide de faire une règle du genre redirect (.*).php $1.html)

Parce que ce sont des erreurs très fréquentes et ça devient lassant de toujours répéter la même chose.

Je suis débutant :roll:
Pourrais tu preciser ce que tu entends par "UR n'est pas magique (ne peut pas faire rewriterule index.php?a=b index-a-b.html"

Et preciser (il y a des pages absolument inutiles à réécrire (résultats de formulaire...)

Je l'integrerais au premier post alors. Ce serait bien aimable de ta part et utile pour tout le monde :wink:
 
WRInaute passionné
En fait,
nombreux sont les débutants qui pensent que l'UR c'est mettre dans un .htacces des lignes qui vont "transformer" leurs page.php?a=b en truc-a-b.html sans changer le code source des pages.

Bien sur que non.
Tant que les liens du site sont toujours des <a href="page.php?a=b">, c'est cela que va voir le navigateur, et aussi les robots. voilà pourquoi je dis qu'il n'y a pas de magie.

Le htaccess ne sert que quand on demande au serveur de "servir" une page, pour rediriger sur le bon script si la page n'existe pas. il ne sert pas à transformer le code source de la page.

De plus, une règle à connaitre est simple :
on ne peut pas traiter la partie ?a=b des URL dans le premier membre de règles.
on ne peut donc PAS rediriger un .php vers un .html en conservant ses paramètres ;)
 
WRInaute occasionnel
J'en parle mais comme tu sembles dire que ce n'est pas clair je viens de reformuler :wink:

Dis moi si tu vois d'autres choses à rajouter style les directives entre []. Je ne vois pas du tout ce que ca fait.
 
WRInaute passionné
L => Après avoir appliqué cette règle, on ne touche plus à rien.
Exemple
Code:
rewrite rule (.*)\.htm $1.jsp
rewrite rule (.*)\.jsp $1.truc

transforme tous les .htm en .jsp et ensuite tous les .jsp en .truc (donc tous les .htm en .truc)
alors que
Code:
rewrite rule (.*)\.htm $1.jsp [L]
rewrite rule (.*)\.jsp $1.truc
transforme les .htm en .jsp, mais ne les retransformera pas en autre chose après.

R=301 => indique au navigateur/au moteur que la page a bougé pour de bon
R=302 => indique un changement temporaire

QSA => transmet les arguments de la chaîne "?truc=muche&bidule=chouette" donc
Code:
rewrite rule (.*)\.jsp $1.truc [QSA,R=301]
transforme l'adresse tapée dans le navigateur
page.jsp?a=b
en
page.truc?a=b

(edit : merci pour la remarque, l'oubli est corrigé :wink: )
 
WRInaute passionné
() : capturer le contenu de l'expression pour pouvoir la réutiliser (on l'utilisera sous la forme $chiffre, où chiffre est la position de la parenthèse : $1 est la première parenthèse ouverte)

[] définit une "classe" autrement dit, les caractères utilisés ou interdits dans l'expression

+ : le contenu de la "classe" indiqué entre [] apparait au moins une fois

^ en début de classe : la classe va définir des caractères interdits.

donc :
([^/]+) sélectionne tous les caractères (au moins un) qui ne sont pas des barres obliques, jusqu'à ce qu'on rencontre une barre oblique.
 
WRInaute discret
Dj_Apx a dit:
En fait,
nombreux sont les débutants qui pensent que l'UR c'est mettre dans un .htacces des lignes qui vont "transformer" leurs page.php?a=b en truc-a-b.html sans changer le code source des pages.

Bien sur que non.
Tant que les liens du site sont toujours des <a href="page.php?a=b">, c'est cela que va voir le navigateur, et aussi les robots. voilà pourquoi je dis qu'il n'y a pas de magie.

Le htaccess ne sert que quand on demande au serveur de "servir" une page, pour rediriger sur le bon script si la page n'existe pas. il ne sert pas à transformer le code source de la page.

De plus, une règle à connaitre est simple :
on ne peut pas traiter la partie ?a=b des URL dans le premier membre de règles.
on ne peut donc PAS rediriger un .php vers un .html en conservant ses paramètres ;)
C'est précisément ce que j'ai dit sur la page d'avant : c'est l'erreur que je faisais au départ, en fait ca ne réécrit pas les URL, ca réinterprète les url envoyées... suivant des règles que l'on donne.
 
WRInaute discret
La 2eme url est plus complexe elle contient 2 paramétres $1 et $2

RewriteRule \portfoliodetail-id-([0-9]+)\-([0-9]+)\.html$
/portfoliodetail.php?id=$1&part=$2
Et si mes variables sont des mots et non des chiffres, j'imagine qu'il faut remplacer ([0-9]+) par quelquechose comme ([a-z]+) ? Est-il utile de garder le "+"

Merci pour votre aide
 
WRInaute discret
Le+, si je ne m'abuse, indique qu'il y a éventuellement plusieurs occurences. sans le plus on recherche un chiffre 0 1 2 3 4 5 6 7 8 9

Alors qu'avec le plus on recherche les nombres : 100 156456 17484894 et ainsi de suite. tu dois aussi pouvoir mettre un joker pour accepter n'importe quoi en valeur de variable.
 
WRInaute passionné
chitopila a dit:
La 2eme url est plus complexe elle contient 2 paramétres $1 et $2

RewriteRule \portfoliodetail-id-([0-9]+)\-([0-9]+)\.html$
/portfoliodetail.php?id=$1&part=$2
Et si mes variables sont des mots et non des chiffres, j'imagine qu'il faut remplacer ([0-9]+) par quelquechose comme ([a-z]+) ? Est-il utile de garder le "+"

Merci pour votre aide
Le + indique qu'il y en a plusieurs ('au moins un')
a-z c'est "minuscule"
A-Z "majuscule"
lettre sera donc : a-zA-Z
lettre ou chiffre : a-zA-Z0-9 ou a-z0-9A-Z ou A-Za-z0-9 (l'ordre ne compte pas)
 
Nouveau WRInaute
Je suis débutant dans l'url rewriting et j'ai lu plusieurs fois les explications mais je les trouve pas si claire que ça... Pourtant je veux un truc tout simple !

Bon je pose le probleme ça sera plus rapide :
Je veux passer mes pages

index.php?page=tourisme
index.php?page=tourisme/lisbonne
index.php?page=liens

en

tourisme.html
tourisme/libonne.html
liens.html

(d'ailleurs je me posais la question pour le / et si ça posais pas pb ??)
Donc comment je fait mon .htaccess ?

RewriteRule...


J'avais pensé a ça :

RewriteRule \([a-z]+)\.html$ /index.php?page=$1


Voila, c'est pas compliqué mais je suis pas sure alors je préfère demandé de l'aide !

Merci les gars !
 
Nouveau WRInaute
Apres reflexion est ce que c'est pas plutot ça ???

RewriteRule \([a-z]+)\/([a-z]+)\.html$ /index.php?page=$1/$2
 
Nouveau WRInaute
Bon ça marche pas ça me fait planter tous mon site des que je mes le fichier .htaccess a la base du site....

RewriteEngine on
RewriteRule \([a-z]+)\/([a-z]+)\.html$ /index.php?page=$1/$2


Toujours personne pour m'aider ?
 
WRInaute discret
Je n'y connais pas grand chose mais de mon côté, j'ai un peu la même chose et j'ai réussi à rewriter

Essaie avec ceci :

Code:
RewriteEngine on
RewriteRule \(.+)\.html$ /index.php?page=$1

Par contre pour le "/" ça risque en effet poser un problème.
 
WRInaute impliqué
M.o.n.d.i.a.n.i a dit:
Principe:
L'url rewriting permet d'utiliser des
urls toute simples au lieu d'url longues et complexes
maPage-val1-val2-val3.html
à la place de
maPage.php?var1=val1&var2=val2&var3=val3

Avantages:
Les bots suivront les liens simplifiés et indexeront votre site en
profondeur. Traitement qui etait réservé avec les URL dynamiques que pour les gros sites à haut PR

Euh... S'il n'y avait que cet avantage, ce serait trop simple et je ne me serais pas intéressé à l'URL rewriting. Google indexe très bien mon site sans ça :lol:

Ce qui me semble le plus intéressant (AMHA), c'est la possibilité de placer de bons mots-clés dans l'URL sans recopier "bêtement" l'ancienne URL en changeant les points d'interrogation par des tirets.

Pour avoir de bons mots-clés, on peut aller les chercher dans les titres des pages. Mais ces titres sont parfois trop longs et comportent des lettres accentuées.

J'ai donc créé dans la base de données de données de mon annuaire de liens un champ spécial pour chaque rubrique, avec des mots-clés non accentués et séparés par des tirets ou des "underscores" selon quel'on veut que Google les considère d'un bloc ou indépendamment.

De cette façon, je peux donc choisir et modifier à volonté le contenu de l'URL menant à chaque rubrique de mon annuaire sans avoir à modifier le titre destiné aux humains.

Mais voilà... Je ne suis pas développeur, et je n'ai pas encore trouvé sur ce forum de message clair et didactique donnant un exemple de script (et de fichier .htacess) permettant d'aller chercher(proprement et élégamment, en économisant au maximum les ressources du serveur et les accès à la base de données !) dans la base de données le champ "urlrew" et de le placer dans l'URL en remplacement de l'URL biscornue d'origine.

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

J'ai bidouillé un succédané d'URL rewriting "maison" dont je donne le principe ici :

Attention, c'est du rustique, mais ça marche !

En admettant que les URL actuels sont assez courtes et lisibles par les robots de Google, on peut simplement ajouter à cette URL "utile" un bout d'URL inutile piochée dans la base de données, un peu comme on le fait déjà pour adapter les balises META (mots-clés) ou le titre de chaque page du site.
Lorsque l'on clique sur le lien, la partie utile de l'URL va permettre d'afficher par exemple une nouvelle page du site, mais la partie "inutile et rajoutée" n'aura aucun effet sur la redirection. Son seul but est d'être stockée par Google pour accumuler des bons mots-clés.
Après tout, qui a dit que tous les paramètres donnés dansune URL devaient être "utiles pour le serveur" ? Les profs à l'école ? Mais là, on est dans la vraie vie, face aux robots de Google, pas en train d'essayer d'avoir une bonne note.

Qualqu'un a -til déjà utilisé cette dernière technique ?
Y a-t-il des critiques ? Un message plus ancien sur ce système ?

Merci :)
 
Nouveau WRInaute
gainsdejeux a dit:
Je n'y connais pas grand chose mais de mon côté, j'ai un peu la même chose et j'ai réussi à rewriter

Essaie avec ceci :

Code:
RewriteEngine on
RewriteRule \(.+)\.html$ /index.php?page=$1

Par contre pour le "/" ça risque en effet poser un problème.
Apres essai :
Code:
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator to inform of the time the error occurred and of anything you might have done that may have caused the error.

More information about this error may be available in the server error log.
Le site ne fonctionne plus du tout des que je met le .htaccess en ligne.
Quand je met ça :

RewriteEngine On
RewriteRule ^(.+)\.html$ index.php?page=$1 [L]


Le site fonctionne mais pas l'url rewritting !
 
Nouveau WRInaute
En fait la solution je l'avais c'est :

RewriteEngine On
RewriteRule ^(.+)\.html$ index.php?page=$1 [L]


Mais j'essayais avec tourisme/lisbonne et dans ce cas comme tu dit il doit y avoir pb avec les repertoires virtuels puisque plus aucune image n'apparaissent.
 
Discussions similaires
Haut