Question mise en place URL Rewriting

  • Auteur de la discussion Auteur de la discussion f@m
  • Date de début Date de début
WRInaute discret
Bonjour,
Suite à une remarque de l'un de vos membres j'ai commencé à regarder le fonctionnement de l'URL rewriting.
J'ai donc commencer par lire le tutorial présent sur le site mais j'ai un peu de mal à l'implémenter.
L'URL rewriting est bien compatible avec mon hébergeur et correctement activé sur mon serveur local

Pour que ce soir plus simple à comprendre je vous donne l'adresse du site est : http://www.footamax.com/

Dans un premier temps je souhaitais tester l'URL rewriting sur les fiches clubs et les fiches joueurs.
Actuellement mes liens se présentent sous la forme : http://www.footamax.com/infos_equipe/fiche_joueur.php?id_player=1533, si j'ai bien compris l'idée de l'URL rewriting est d'avoir une URL de ce type http://www.footamax.com/infos_equipe/fiche-joueur-1533 ?
J'ai donc ajouté dans mon répertoire un fichier htaccess conteannrt le code suivant :

Code:
Options +FollowSymlinks
RewriteEngine on
RewriteRule ^fiche-equipe-([0-9]+)-([a-z]+)\.html$ /fiche_equipe.php?id_equipe=$1&aff=$2 [L]
RewriteRule ^fiche-joueur-([0-9]+)\.html$ /fiche_joueur.php?id_player=$1 [L]

Jusque là pas de souci, par contre je ne comprends pas comment modifier mon code qui renvoit vers la page "récrite" (http://www.footamax.com/infos_equipe/fiche-joueur-1533)

et dernière question comment rempalcer l'id du joueur par son nom ?

merci pour votre aide,

f@m
 
WRInaute discret
Merci pour ton retour.
J'ai compris mon erreur, j'avais bien vu pour le html mais mon problème était au niveau de mon htaccess (le / slash devant fiche_joueur.php et fiche_equipe.php) alors que les fichiers étaient au même niveau !

Qu'entends tu par
je te conseillerais de le mettre à ta racine du site

Et sinon, comment faire afficher le nom du joueur dans l'URL réécrite plutôt que son id ? ce serait mieux pour l'indexation non ?

Merci
f@m
 
WRInaute discret
J'ai lu qu'il était conseillé de mettre le htaccess dans chaque répertoire, qu'en penses-tu ?

Si tu remplaces -joueur- par son nom et que tu laisses l'id, ça devrait marcher aussi

C'est tout à fait possible mais il me semblait qu'il était plus propre de se débarasser de l'id ... j'ai vu ça sur certains sites ..mais je ne vois pas trop comment faire cette réécriture.
 
WRInaute discret
Moi je te déconseillerais de faire de la sorte. J'ai toujours centralisé toutes les règles dans 1 fichier à la racine.
Si tu as des centaines de règles, c'est discutable par contre car Apache parsera le .htaccess à la racine tout le temps donc légère perte de temps.
L'avantage d'un seul fichier est que tu as toutes les règles à un seul endroit.

Si tu enlèves l'id du coup tu vas faire ton SELECT sur le nom du joueur et ça risque de ralentir tes requetes.
Pour moi ça ne change rien que tu laisses l'id au niveau SEO
 
WRInaute discret
Merci pour tes conseils avisés , maintenant j'ai du boulot car je me rends compte que je vais avoir un certain nombre de pages à modifier mais si cela peut améliorer mon référencement il faut bien y passer :D
f@m
 
WRInaute discret
Y a un truc que je ne comprends pas, suite à tes recommandations j'ai mis mes règles de réécritures d'URL dans le htaccess se trouvant à la racine du site et depuis erreur 404, le lien me semble pourtant correct :

Code:
RewriteRule ^fiche-joueur-([0-9]+) /infos_equipe/fiche_joueur.php?id_player=$1 [L]

Je comprends pas, la ligne suivante fonctionne parfaitement si le htaccess se trouve dans le dossier infos_equipe

Code:
RewriteRule ^fiche-joueur-([0-9]+) fiche_joueur.php?id_player=$1 [L]

Qu'est ce qui cloche ?
 
WRInaute discret
Ce ne serait pas plutot ça ta regle?
RewriteRule ^infos_equipe/fiche-joueur-([0-9]+) /infos_equipe/fiche_joueur.php?id_player=$1 [L]

=> ça commence par infos_equipes et pas par fiche-joueur-1234

Regarde tes logs d'erreurs apache ce qu'il te dit, je pense que tu comprendras rapidement
 
WRInaute discret
Je suis vraiment un gros boulet !!
Forcément ça marche nettement mieux
Encore une fois, un grand merci pour ton aide.
 
WRInaute discret
Tout d'abord permettez moi de vous souhaiter une très bonne année 2013.

J'avance sur mon url rewriting mais je me pose encore quelques questions.
J'ai actuellement ce type de lien sur le site resultats_championnat.php?id_compet=1 ou id_compet correspond à une compétition (Ligue 1 ou Ligue 2 ou Liga ...)

Si j'ai bien compris dans ma réécriture d'URL je suis obligé de conserver la variable id_compet mais je ne sais pas trop ou la positionner dans mon url pour que ce soit le plus pertinent au niveau du référencement.

Pour l'instant je pensais partir sur l'une des 2 redirections ci-dessous :

RewriteRule ^football/([0-9]+)/resultats-([a-zA-Z0-9_-]+) football/resultats_championnat.php?id_compet=$1 [L]

OU

RewriteRule ^football/resultats-([a-zA-Z0-9_-]+)/([0-9]+) football/resultats_championnat.php?id_compet=$2 [L]

Je préfère avoir un avis d'expert avant de continuer car je vais avoir à gérer ce cas dans pas mal de pages de mon site.

Merci d'avance
 
WRInaute accro
Met tes id le plus loin possible en fin d'url. C'est pas forcement impactant (du moins c'est discuté) mais c'est plus propre et lisible.
Ce qui pourrait motiver un autre choix serait que l'id aurait une certaine pertinence dans la requête. Comme par exemple si tu avais une date sous forme d'id. Alors là, il pourrait être intéressant de former des url avec une notion de structure genre :

example.com/resultat/xxxdatexxx/truc.php
 
WRInaute accro
f@m a dit:
Et sinon, comment faire afficher le nom du joueur dans l'URL réécrite plutôt que son id ?
Il y a deux parties distinctes dans un projet de réécriture d'url :
1/ la première se passe sur tes pages ou tu affiche des liens. C'est là qu'a partir de ton CMS tu dois être capable de fabriquer des liens qui comprennent le nom du joueur.
2/ ensuite dans le htaccess il faut faire en sorte que tu soit capable de séparer dans le dossier concerné la partie "textuelle" qui correspond au nom du jouer dont tu te contrefous totalement et la partie numérique de l'url qui va te permettre d'extraire l'id qu'il faut transmettre au script gérant ce type de page.

dans ton cas ça pourrait donner un truc du genre :

RewriteRule ^infos_equipe/([a-z]+)-([0-9]+) /infos_equipe/fiche_joueur.php?id_player=$2 [L]

pour une url du type

http://www.example.com/infos_equipe/tartempion-123

edit -> tant que tu y est si tu évitais les caractères soulignement au profit du moins (tiret du 6) ça serait un must pour tes urls.
 
WRInaute discret
Merci pour toutes ces informations, pour résumer tu me conseilles donc de mettre les id le plus loin possible dans l'url, à tout hasard ne serait-il pas possible de les masquer ?
Dans l'exemple précédent, ma redirection d'URL devrait me donner une adresse du style resultats-championnat-liga/6 (6 correspondant à ma variable id_compet). Ce n'est pas bien génant mais si il y avait une solution pour masquer cette partie de l'URL ce serait encore mieux.

Concernant ta dernière remarque

tant que tu y est si tu évitais les caractères soulignement au profit du moins (tiret du 6) ça serait un must pour tes urls.

Ce paramètre a bien été corrigé lors de la réécriture mais mes fichiers initiaux sont effectivement tous avec des "underscore" ... les pages indéxées seront de toute façon celles avec les "tirets" ?
@+
 
WRInaute accro
f@m a dit:
Ce n'est pas bien génant mais si il y avait une solution pour masquer cette partie de l'URL ce serait encore mieux.
Faudrait changer tout le système ou lui donner la possibilité de retrouver l'id de page a partir du nom du joueur voir de la page mais c'est plus lourd a mettre en oeuvre. C'est toutefois ce que je fais sur mes système, les pages en base comprennent l'url de la page moins le nom de domaine ce qui me permet de les identifier rapidement et de les produire. Le système de l'id est identique sauf qu'il évite de faire une requête pour obtenir ce fameux identifiant unique a la suite du processus de production de contenu.

f@m a dit:
Ce paramètre a bien été corrigé lors de la réécriture mais mes fichiers initiaux sont effectivement tous avec des "underscore" ... les pages indéxées seront de toute façon celles avec les "tirets" ?
C'est pas vital ... c'est juste plus propre. Regarde l'url produite si c'est full tiret sans "underscore" pas de souci.

Fait attention car tu est en train de modifier tranquillement toutes tes urls. Vérifie bien que les anciennes urls ne sont plus accessible sans renvoyer un code 301 vers les nouvelles ... sinon tu va te retrouver avec deux urls indexées qui servent le même contenu et ça c'est très mauvais. (c'est juste pour mémoire j'ai pas re regardé comment tu fait précisément)
 
WRInaute discret
Merci pour ce complément d'infos, je vais donc en rester avec mon id en fin de chaine.

Concernant les url modifiées, pour l'instant je fais ça sur mon serveur local donc pas de souci pour l'indexation
On est d'accord que l'ancienne url continuera à fonctionner ? par contre je confirme que ce n'est pas terrible pour l'indexation

Dans ce cas, est-ce que le fait de fournir un nouveau sitemap peut-être suffisant ?

Encore merci pour votre aide.
 
WRInaute accro
f@m a dit:
Dans ce cas, est-ce que le fait de fournir un nouveau sitemap peut-être suffisant ?
Le sitemap c'est un emplâtre pas un outil de travail ... Si tes anciennes url sont toujours accessibles en plus des urls réécrites il faut absolument faire une 301 de l'ancienne vers la nouvelle afin de prévenir les moteurs (tous, pas que ceux qui lisent les sitemap) que tes pages on changé d'adresse.

edit -> j'ajoute que l'effet négatif d'une absence de 301 induisant du DC est plus important que le gain très relatif d'une réécriture incluant des mots clés dans les URLs ;-)
 
WRInaute discret
Bonjour,
J'avais un peu temporisé sur le sujet mais j'ai décidé de me remettre à mes réécritures d'URL.

J'ai commencé avec quelques pages et ça marche parfaitement par contre je suis confronté à un problème sur mes pages utilisant une liste déroulante.

Dans mon htaccess j'ai ajouté la ligne suivante :

Code:
RewriteRule ^football/resultats-([a-zA-Z0-9_-]+)/([0-9]+) football/resultats_championnat.php?id_compet=$2 [L]

Mes liens pointant vers cette page sont sous cette forme
Code:
football/resultats-classement-Ligue1/1

Jusque là ça fonctionne, par contre sur cette page j'ai une liste déroulante avec les saisons disponibles et c'est là que je coince car je ne sais comment faire passer ma avriable saison (en post si possible)
Au final, il faudrait que l'URL réécrite soit sous cette forme :
Code:
football/resultats-classement-Ligue1/saison2012-2013/1
Je bloque un peu sur ce passage de variable ???

merci d'avance pour votre aide
 
WRInaute discret
Je ne sais pas si j'ai été suffisamment clair dans mon explication, pour être plus précis lorsque je dis "liste déroulante" je parle bien évidemment d'un formulaire :

Code:
<form name="form_saison" method="post" action="".$_SERVER['REQUEST_URI']."">
<select name="saison" onChange="submit()">
........

Mais malheureusement le résultat attendu n'est pas celui que je souhaite
 
WRInaute accro
Un doute m'habite mais il manque pas un $1 ici :

RewriteRule ^football/resultats-([a-zA-Z0-9_-]+)/([0-9]+) football/resultats_championnat.php?id_compet=$2 [L]

Ca serait pas plutôt du genre :

RewriteRule ^football/resultats-([a-zA-Z0-9_-]+)/([0-9]+) football/resultats_championnat.php?type_compet=$1&id_compet=$2 [L]

Sinon comment pourrait-il récupérer ceci ([a-zA-Z0-9_-]+) ?

Si il a besoin de vérifier que la compet (ou le nom de joueur) correspondent bien à l'id il vaut mieux qu'il récupère aussi le $1, ceci afin de faire de bonnes redirections 301 dans le cas ou il y a de mauvaises URL

exemple :

si normalement la bonne url est celle-ci : football/resultats-championnat/12
mais que sur un forum quelqu'un à mal mis le lien et met ceci : football/resultats-coupe/12

il risque de se retrouver avec du DC non parce qu'il ne pourra pas vérifier le $1 puisqu'il ne le récupère pas?
 
WRInaute discret
Bonne remarque mais je te confirme que c'est bien l'écriture que j'utilise, je récupère le type de compet via une fonction donc cela ne me semble pas nécessaire de la passer en paramètre après ce n'est peut-être pas la bonne pratique ...
 
WRInaute accro
t'as une fonction php qui découpe ton URl pour bien identifié la compétition c'est bien ça?

Dans ce cas aucune idée je sais pas qu'elle est la meilleur solution :wink:
 
WRInaute discret
Ce n'est pas tout à fait comme ça mais on va faire plus simple car ce qui me pose problème c'est le passage de variable via formulaire. Pour résumer je voudrai que mon url soit comme ceci
Code:
football/resultats-classement/saison2012-2013/1
ou
Code:
football/resultats-classement/saison2011-2012/1
en fonction de la saison sélectionnée dans ma liste déroulante.

L'idéal serait de passer la variable saison en POST
 
WRInaute discret
Personne n'aurait une solution ? sinon je me passerai d'URL rewriting sur mes pages utilisant des liste déroulante ... d'ailleurs comment ça se passe pour les pages en ajax ?
 
WRInaute discret
De retour de vacances je relance le sujet car je n'ai toujours pas la solution ... en lisant quelques forums j'ai pu lire qu'il n'y avait aucun intérêt pour le référencement de faire de la réécriture d'URL lorsque l'on utilise un formulaire.
Dans mon cas précis celà signifie t-il que ce que je cherche à faire n'a aucun intérêt ?

Dois-je rester sur des url de ce type : football/resultats_classement.php?saison=$var_saison ou $var_saison correspond à la variable de ma liste déroulante plutôt que sur une réécriture du type football/resultats-classement/saison2012-2013.html ?

merci d'avance pour votre aide
 
WRInaute discret
Merci spout pour ce lien mais étant "novice" sur le sujet je n'ai pas bien compris ce que tu entendais par "Alors qu'avec un front controller et une seule règle tu aurais pu gérer TOUT" :(
En lisant quelques post sur ce sujet j'ai l'impression que celà me demanderait de grosses modification sur le site ... chose que je voudrais éviter.
Si c'est vraiment compliqué à metrtre en place je n'utiliserai l'URL rewriting que pour mes pages n'utilisant pas de formulaire
 
WRInaute discret
spout a dit:
Et à chaque fois tu dois faire une règle de rewrite différente. Alors qu'avec un front controller et une seule règle tu aurais pu gérer TOUT:
https://www.webrankinfo.com/forum/pratique-htaccess-lire-avant-poser-t13288 ... l#p1217718

Pourquoi il faudrait faire plus de regles via .htaccess que via PHP?
Si tes expressions régulières pour récupérer les données sont bien faites, tu n'as pas 500 lignes dans ton fichier.
Sur des grosses charges, le traitement fait par apache est plus rapide que par le moteur PHP
 
WRInaute accro
Parce que c'est beaucoup plus flexible en PHP qu'en rewrite htaccess (regex, routes à partir de la DB, reverse routing, prefix/extension routing, ...). Et puis si après tu passes de Apache à Lighttpd ou autre, 1 règle à refaire.

Regarde WP, Drupal, etc ... c'est comme ça qu'ils font en général.

liens-geeks.com a dit:
Sur des grosses charges, le traitement fait par apache est plus rapide que par le moteur PHP
Si la vitesse en charge est ta préoccupation, oublie Apache...
 
WRInaute discret
spout a dit:
Parce que c'est beaucoup plus flexible en PHP qu'en rewrite htaccess (regex, routes à partir de la DB, reverse routing, prefix/extension routing, ...). Et puis si après tu passes de Apache à Lighttpd ou autre, 1 règle à refaire.
Regarde WP, Drupal, etc ... c'est comme ça qu'ils font en général.
Si la vitesse en charge est ta préoccupation, oublie Apache...

Wordpress et Drupal ne sont pas vraiment des modèles de rapidité (c'est assez hallucinant de profiler les scripts d'ailleurs) et de tout gerer en PHP ne permet que d'augmenter leur compatibilité environnementale.
Effectivement si tu changes de serveur, forcément la solution PHP est plus adaptée mais d'un autre côté on est plus à ça près quand on effectue ce genre d'opération.
Nous on tenait sur du 70 000 visiteurs uniques/jour sur 2 apache load balancés avec toutes les règles d'URL rewriting en htaccess. Certes Apache ce n'est plus la Ferrari de l’époque mais je pense que ça pourrait convenir à la majorité des sites Français.

Moi j'aimerais tout simplement voir un exemple concret de .htaccess chargé et son equivalent en PHP qui ne fait que quelques lignes!
 
WRInaute discret
N'ayant pas tout compris dans vos explications j'ai trouvé une solution qui semble fonctionner mais qui ne me semble aps très propre.

Au lieu d'appeler ma page courante, le formulaire fait appel à une autre page :

Code:
<form name="formu" method="get" action="traitement.php">

le fichier traitement.php contient simplement un traitement de l'URL (j'ai pris un exemple simple):

Code:
<?php
$url = "football/resultats-classement/saison".$_GET['id_compet'].".html";

header("Location: ".$url);
?>

Merci de me dire ce que vous en pensez, je rappelle que c'est un exemple simple dans certains cas l'URL sera beaucoup plus complexe
 
WRInaute accro
liens-geeks.com a dit:
Sur des grosses charges, le traitement fait par apache est plus rapide que par le moteur PHP
Non pas forcement, il n'y a pas de règle d’ailleurs pour affirmer que c'est mieux dans un sens ou dans l'autre. Le gros truc qui fait souvent (pour moi) une différence c'est que htaccess va être rejoué pour chaque ressource demandée au serveur (y compris les images, les js etc ...), donc si tu commence a charger le htaccess et que le site comprend de nombreuses ressources hors php tu augmente considérablement la charge serveur pour pas grand chose. A ce stade il est préférable de n'avoir qu'une unique règle pour la gestion des urls de page (scripts php) et démerder ça en php derrière car tes ressources classiques seront ignorées par le htaccess rapidement.
Un autre cas qui me concerne est lié a une refonte. J'ai des tonnes d'urls (plusieurs milliers) qui sont a rediriger, le htacces avec qques règles simples envoie tout sur un script php qui lui fini le travail avec des règles précises page a page, ça m'évite 10 000 lignes de htaccess et le cout machine qui va avec tout en laissant libre le nouveau site.
 
WRInaute discret
f@m a dit:
N'ayant pas tout compris dans vos explications j'ai trouvé une solution qui semble fonctionner mais qui ne me semble aps très propre.

Au lieu d'appeler ma page courante, le formulaire fait appel à une autre page :

Code:
<form name="formu" method="get" action="traitement.php">

le fichier traitement.php contient simplement un traitement de l'URL (j'ai pris un exemple simple):

Code:
<?php
$url = "football/resultats-classement/saison".$_GET['id_compet'].".html";

header("Location: ".$url);
?>

Merci de me dire ce que vous en pensez, je rappelle que c'est un exemple simple dans certains cas l'URL sera beaucoup plus complexe

Pourquoi tu conserves un formulaire?
Affiche tes différents choix sous forme de liens ou de menu et les internautes cliquent dessus directement.
Niveau re-ecriture ça parait logique
 
WRInaute discret
zeb a dit:
Un autre cas qui me concerne est lié a une refonte. J'ai des tonnes d'urls (plusieurs milliers) qui sont a rediriger, le htacces avec qques règles simples envoie tout sur un script php qui lui fini le travail avec des règles précises page a page, ça m'évite 10 000 lignes de htaccess et le cout machine qui va avec tout en laissant libre le nouveau site.

Comment tu peux avoir autant de lignes ds un htaccess?
Si le site est bien structuré, il n'y a pas autant de cas que ça à gerer sur la structure des urls. Je suis étonné par ce point...
 
WRInaute discret
Pourquoi tu conserves un formulaire?
Affiche tes différents choix sous forme de liens ou de menu et les internautes cliquent dessus directement.
Niveau re-ecriture ça parait logique

C'est effectivement la solution pour laquelle j'ai optée... c'est finalement nettement plus simple.

Par contre je suis confronté à un autre problème, j'ai plusieurs règles dans mon htaccess et j'ai l'impression que certaines ne fonctionnent pas correctement selon l'endroit où elles se trouvent dans mon htaccess.
Y-a-t-il des règles à respecter ?
 
WRInaute discret
La priorité d’exécution des regles se fait de haut en bas.
Des que le serveur a trouvé une correspondance au niveau re-ecriture d'url; il n'en prendra pas d'autres en compte

Si une regle fonctionne a un endroit et pas à un autre c'est qu'une autre prend le dessus probablement
 
WRInaute accro
liens-geeks.com a dit:
Comment tu peux avoir autant de lignes ds un htaccess?
Si le site est bien structuré, il n'y a pas autant de cas que ça à gerer sur la structure des urls. Je suis étonné par ce point...
Relis bien c'est justement le contraire. Après tu croise des sites don le plan d'url n'est pas forcement bien fait ... et parfois tu n'y peut rien.
 
WRInaute discret
Des que le serveur a trouvé une correspondance au niveau re-ecriture d'url; il n'en prendra pas d'autres en compte

Si une regle fonctionne a un endroit et pas à un autre c'est qu'une autre prend le dessus probablement

J'ai compris mon erreur, voilà les 2 règles qui posaient problème :

Code:
RewriteRule ^football/([a-z]+)/([a-zA-Z0-9_-]+)-([0-9]+).html infos_equipe/fiche_equipe.php?id_equipe=$3&equipe=$2&aff=$1 [L]

RewriteRule ^football/mercato/les-plus-gros-transferts-du-mercato-([0-9_-]+).html infos_equipe/top_transferts.php?saison=$1 [L]

N'étant pas encore un grand spécialiste de la réécriture d'URL j'ai simplement changé l'odre de ces 2 règles et ça semble fonctionner
 
WRInaute discret
Bonjour,

Je me permets de relancer ce post car j'ai bien avancé sur le sujet et j'aimerai avoir votre avis,

Ci dessous un exemple avec une section dans lesquelle j'ai mis en place l'URL rewriting :
http://www.footamax.com/football/archives/ligue-1/1/saison-2012-2013.html

Je suis cependant confronté à quelques porblèmes :
- Régulièrement Google me remonte des URL inaccessibles (pourtant lorsque je clic dessus elle fonctionne parfaitement) ... est-ce que ce pourrait être un problème lié à mon hébergeur ?
- En raison de ces problèmes est-ce vraiment judicieux de faire de la réécriture d'URL sur toutes les pages du site ?

Merci d'avance pour vos commentaires avisés
 
WRInaute discret
Personne n'a été confronté à des problèmes similaires suite à la mise en place de l'URL Rewriting ?
 
WRInaute discret
Hello,
On a -tous- été confrontés à ce genre de problèmes mais sans ans analyse de ton site / accès a GWT / etc..., c'est compliqué de répondre à tes questions!
 
WRInaute discret
ok merci pour ton retour, depuis quelques jours les outils Google ne semblent plus me remonter d'erreurs donc je surveille ça de prsè.

Je ne connais pas GWT mais je vais regarder ;)

Merci
 
WRInaute discret
Une dernière petite question.

Suite à la mise en place de l'URL rewriting j'avais renvoyé mon sitemap à Google.
Je constate cependant que lors de certaines recherches Google propose les anciennes URL, d'où cela peut-il venir ?

Encore une fois merci pour votre aide
 
Discussions similaires
Haut