referencement VS administration

Eléphant du PHP | 186 Messages

07 mars 2008, 19:23

Bonsoir à tous!

Je viens vers vous avec une question qui trouvera, je l'espère, une réponse.

Je me trouve confronté au problème suivant:

J'ai un menu, donc constitué de plusieurs liens. Ces liens doivent rediriger les internautes vers des pages ayant une architecture (en terme de présentation des infos) identique.

Qui plus est, depuis l'interface d'administration du site, je souhaite avoir la possibilité de rajouter des liens dans mon menu ou d'en supprimer.

Dans l'idéal et dans ce souci d'administration, j'envisageai d'avoir une seule page sur laquelle pointent les différents liens du menu et dont le contenu, chargé dynamiquement (PHP + base de données) serait fonction du lien cliqué.

Néanmoins, je me pose la question du référencement. Ne faudrait-il pas avoir des pages distinctes et correspondantes à chaque lien afin d'avoir des noms de pages différents et nommés avec des mots clés?

Cependant cette technique a le gros inconvénient suivant: si je crée un nouveau lien, il faut que je crée aussi une nouvelle page.

Des avis sur la question??

Merci par avance pour vos conseils avisés.

ViPHP
ViPHP | 2144 Messages

07 mars 2008, 19:41

Bonjour,

Tu peux utiliser une pages dynamique (un seule fichier et le contenu provenant d'une base de donnée) et avoir des liens "classiques" sans variables dans l'url, en utilisant de l'Url Rewriting.
Par exemple avoir un lien:
page2.html
qui redirige en fait vers
page.php?id=2

Une petite recherche sur google ou sur le forum, t'en dira plus sur cette technique.

Eléphant du PHP | 186 Messages

08 mars 2008, 10:29

Bonjour iclo,

Je connais un peu le url rewriting. Cependant, n'y a t-il pas de risque de duplicate content entre page2.html et page.php?id=2 ????

merci

Mammouth du PHP | 1511 Messages

08 mars 2008, 12:14

Non puisque page2.html est une page virtuelle qui n'est en fait que page.php?id=2, c'est une sorte de masque si tu préféres, pour cacher la véritable adresse puisque page2.html n'existe pas physiquement.
@+ ;)

Eléphant du PHP | 186 Messages

08 mars 2008, 12:25

ok je comprend.

J'ai vu aussi que si l'url rewriting était géré par .htaccess, il y avait très peu de risque de duplicate content.

Maintenant, une autre question se pose: Est-il possible de générer un .htaccess à la volée, ou du moins de modifier son contenu.

Je m'explique. Si j'ajoute un lien dans mon menu, depuis mon interface d'administration et qu'il mène vers page.php?lien=10, et que je veuille faire une réécriture du type "nomdulien-10.html", est-ce que je suis forcé de réouvrir le .htaccess pour écrire moi même le changement d'url ou puis-je le faire de manière automatisée?
Et ce même pour une modification de la valeur de "nomdulien"??

Merci par avance pour vos conseils.

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

08 mars 2008, 13:51

Le fichier .htaccess est un fichier texte comme un autre, tu peux donc très bien le lire, le compléter ou l'écraser avec php :)

En revanche il peut être judicieux de définir un masque assez global puisqu'au final seule l'id t'importe, cela t'éviterais d'avoir à modifier le fichier à chaque fois si tu rediriges les requête du type "(n'importe quoi)-(id).html" vers "page.php?lien=(id)"
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 28 Messages

08 mars 2008, 16:08

Salut,

En effet, ça serait assez pénible, par exemple sur PHPfrance de taper à chaque fois l'url d'un nouveau topic dans un htaccess , ou même de le rajouter dynamiquement avec PHP :D

Comme l'a expliqué Ryle, toute la puissance de l'url rewriting réside dans l'utilisation possible des expressions régulières !

Avec une page "nomdulien-10.html", ça devrait donner quelque chose comme ça au niveau du htaccess :

Code : Tout sélectionner

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

Eléphant du PHP | 186 Messages

08 mars 2008, 16:30

Si je prend un exemple bidon d'une table relatant mes liens dans une bdd:

Code : Tout sélectionner

table "famille" [b]id[/b] [b] nomfamille[/b] 1 poissons 2 viandes 3 crustacés
A présent, j'ai une autre table qui contient d'autres liens en relation avec la première table

Code : Tout sélectionner

table "sousfamille" [b]id[/b] [b] nomssfamille[/b] [b]idfamille[/b] 1 maquereaux 1 2 brochet 1 3 truite 1 4 vache 2 5 cochon 2 6 crevettes 3
A présent, je suis sur mon site et je clique sur le lien intitulé "poissons" puis sur celui appelé "brochet".
Mon url non écrite donnerait "produits.php?famille=1&ssfamille=2"
Moi ce que je voudrais que cela écrive, c'est "poissons/brochet.html" par exemple

Et si je choisi de voir "viande de vache" que cela écrive "viandes/vache.html".

Est ce possible? ou manque t'il des infos dans les paramètres envoyés dans l'url comme les noms des familles de produits et des sousfamilles.

Eléphanteau du PHP | 28 Messages

08 mars 2008, 17:24

Re-bonjour,

Aucun problème, les expressions régulières te permettent de faire vraiment plein de choses :)

Dans ton exemple, ça devrait donner quelque chose comme ca :

Code : Tout sélectionner

RewriteEngine on RewriteRule ([a-z]+)/([a-z]+)\.html$ /produits.php?famille=$1&ssfamille=$2
Pour savoir faire ça à ta guise, je ne peux que te conseiller le tutorial du siteduzero pour commencer (partie 1, partie2) ainsi que le site expreg donné en lien plus haut :)

Eléphant du PHP | 186 Messages

10 mars 2008, 10:08

Bonjour tout le monde!

Je ne suis pas sur d'avoir bien expliqué ce que je souhaiterais avoir au final ou alors je ne comprend pas trop ce qu'il faut faire.

Tout d'abord merci pour vos conseils. Je suis allé faire un tour du côté des expreg. Je pense qu'il me faudra un temps d'adaptation mais le tuto est très bien expliqué.

Juste un retour sur ce que je pensais faire.
Au niveau de ma bdd, j'ai par exemple un article qui se classe dans une sous famille de produits, elles-mêmes faisant partie d'une famille.

Dans mon menu, cela peut se matérialiser comme un menu à deux niveaux:
- 1er niveau correspondant aux grandes familles;
- 2ème niveau correspondant à la sous famille;

Une fois une famille choisie (ex: viandes), l'internaute est redirigé vers une page où apparaissent les sous-familles correspondant à la famille choisie.
Il choisit alors une sous-famille (ex:vache) qui fait apparaitre une liste de produits.

Au niveau de mon url, cela se traduirait par "liste-produit.php?famille=1&ssfamille=2"
On constate que seuls les id apparaissent et non les noms de la famille (ici viandes) et de la sous famille (ici vache).
L'ensemble de mes familles et sous familles vont être régies de la même manière car c'est la même page qui va les afficher.

Ce que je voudrais savoir, c'est comment, au niveau du .htaccess, faire une correspondance entre les id (familles et sous familles) et leurs noms respectifs pour passer de:
"liste-produit.php?famille=1&ssfamille=2" à ça: "viandes/vache.html"

Suis-je obligé de faire apparaitre les noms dans l'url de départ?
Doit-il y avoir un nombre de variable équivalent entre l'url de départ et celle réécrite. Auquel cas je devrais avoir quelque chose comme ca:
"liste-produit.php?familleid=1&nomfamille=viandes&ssfamille=2&ssfamille=vache"
pour obtenir une url réécrite de ce type:
"viandes/vache-1-2.html"

Je reviens aussi sur ce qu'a écrit Ryle au sujet de la modification du contenu du .htaccess via php. Comment dois-je procéder? Seulement, je voudrais que mon masque change dynamiquement en fonction des familles choisies et des sous-familles.

Merci par avance pour toute réponse et conseil.

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

10 mars 2008, 12:30

La ré-écriture d'url ne permet que de ré-écrire des url (ça semble évident, mais on peut parfois l'oublier :)). Le serveur web prend l'url demandée par l'internaute, regarde si elle correspond à un masque et le cas échéant, la transforme en suivant la règle que tu lui as donné, mais il ne fait rien de plus. En gros, tu ne peux pas lui demander de transformer tout seul "viande" en "1", il faut que tu spécifies explicitement que s'il trouve le mot "viande" à tel endroit de ton url, alors il doit rediriger l'utilisateur vers telle page, avec l'id égal à 1.

Le problème de cela, c'est que tu vas avoir autant de règles de ré-écriture que d'éléments dans ta base, et qu'il va falloir les maintenir en parallèle ce qui est fastidieux (comme les moutons) et sans grand intérêt vu les possibilités qu'offre les expressions régulières.

Le nombre de paramètre dans l'url de départ et dans celle d'arrivée n'a pas nécessairement besoin d'être identique. La seule chose importante c'est que dans celle d'arrivée tu ais toutes les informations nécessaires. En gros, si tu n'utilises pas "viandes" ou "vache", aucune raison de les récupérer :) Dans ton cas, si tu utilises des adresses de la forme "viandes/vache-1-2.html", tout ce dont tu as besoin de récupérer ce sont les id 1 et 2 pour pouvoir les passer à ton script existant.

En revanche, si tu veux utiliser une url du type "viandes/vache.html" où tu ne dispose pas des id, il te faut effectivement récupérer les infos "viandes" et "vache" à l'aide de l'expression régulière, mais également créer un nouveau script php qui prendra non plus les id famille et sous famille pour afficher la page, mais les libellés de celles-ci....
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 186 Messages

10 mars 2008, 13:28

Je prefère garder les numeros des id pour l'utilisation de mon script php.
Donc si j'ai bien compris, il faudrait que dans l'adresse non réécrite mais qui fera fonctionner mon script php, je retrouve ces éléments:
"liste-produit.php?familleid=1&nomfamille=viandes&ssfamille=2&ssfamille=vache"

afin de faire afficher quelque chose du genre: "viandes/vache.html".

Quelle serait alors la règle de réécriture à faire afficher dans le .htaccess?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

10 mars 2008, 14:09

Donc si j'ai bien compris, il faudrait que dans l'adresse non réécrite mais qui fera fonctionner mon script php, je retrouve ces éléments:
"liste-produit.php?familleid=1&nomfamille=viandes&ssfamille=2&ssfamille=vache"
L'inverse :?

Il faudra que ton url réécrite soit de cette forme pour que le .htaccess puisse le récupérer :

Code : Tout sélectionner

/1-viandes/2-vaches.html
Je pense que tu n'a pas compris en truc.
Le serveur reçoit l'url réécrite et la transmet au .htaccess qui la transforme en url non réécrite.
C'est donc l'url réécrite qui doit contenir tout ce que l'url non réécrite à besoin, mais peux également contenir plus, comme dans mon exemple où "viandes" et "vaches" ne sont qu'informatifs.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 2144 Messages

10 mars 2008, 14:23

Autre possibilité : que ce soit le script qui transforme les noms en id, au début de son exécution.