URL Rewriting à plusieurs variables / problèmes de tirets

Nouveau WRInaute
Bonjour à tous,

Il s'agit de mon premier post, alors j'espere que je trouverais un peu d'aide quant à un probleme auquel je fais face.
Pour info je m'appelle Augustin et je viens de lancer un site sur l'actualité de la musique électronique. Celui-ci consiste à la diffusion d'articles au quotidien.

J'ai décidé pour améliorer mon référencement de passer en mode rewriting. Apres avoir lu par mal d'articles je me suis donc lancer dans le grand bain. Mais quelques problemes subsistent.

J'ai renommé tout d'abord dans mes pages les liens de la facon suivante, sachant que j'ai des tables pour chaque rubrique.
http://www.actualites-electroniques.com/FR-<?php echo $donnees['rubrique']; ?>-<?php $artistetiret = str_replace(' ', '-', $donnees['artiste']); echo $artistetiret; ?>-<?php $titretiret = str_replace(' ', '-', $donnees['titre']); echo $titretiret; ?>

Ainsi j'ai remplacé les espaces, de mes variables initiales, par des tirets afin de rendre l'ensembles plus propre et interprétables.

Si j'ecris un article sur David Guetta - One more time, dans la catégorie Track, le lien doit donc etre http://www.actualites-electroniques.com/FR-Track-David-Guetta-One-Love

En complément mon fichier .htaccess avait la ligne suivante, afin de traduire cela en langage PHP:
RewriteRule ^FR-Track-([a-zA-Z0-9\-]+)-([a-zA-Z0-9\-]+)$ Track-Archive.php?artiste=$1&titre=$2 [L]

L'antislah est là pour que le signe "-" soit bien compris, c'est que j'avais lu dans d'autres sujets. Je pensais donc qu'avec cette formule précédente tout fonctionnerait bien.

Or il se trouve que lorsque je genere une nouvelle page les variables sont mal intepretées et mes requetes analysent mal ces memes variables, qui sont mélangées entre elles. Le bout d'un titre va allé se mélange avec le nom d'un artiste et mes requetes ne peuvent donc plus marcher.

Par contre et c'est là ou c'est etonnant, les articles s'affiche correctement si la variable titre est composé uniquement d'un seul et unique mot.

Au final voici ma question est donc: comment faire en sorte que mes variables soient bien interpretees par le fichier htaccess et que celui ci fasse le distingo entre tiret de separation de variable et tiret pour remplacer les espaces.

Vous pouvez voir le probleme directement sur mon site ici par exemple :
http://www.actualites-electroniques.com/FR-Indemodable-Etienne-de-Crec ... -Prix-choc

Dans le haut de la page il identifie en artiste "Etienne de Crecy Prix" et en titre "choc" alors que le titre réel est "Prix choc"

Quant à elle la page : http://www.actualites-electroniques.com/FR-Indemodable-Alan-Braxe-and- ... alke-Intro est parfaitement interpretée, avec l'affichage de l'article en question.

Merci d'avance de vos conseils et de votre aide, parce que là vraiment je galère...
 
Nouveau WRInaute
Bonjour Dj Aroy,

Il se pourrait que ton problème vienne du fait que tu utilises le tiret (-) comme séparateur de mot ET comme séparateur de variable.

Tu devrais essayer d'utiliser l'underscore (_) comme séparateur de variable, du style : nom-du-chanteur_titre-associe et remplacer ta règle de réécriture par celle-ci:

^FR-Track-([a-zA-Z0-9\-]+)_([a-zA-Z0-9\-]+)$ Track-Archive.php?artiste=$1&titre=$2 [L]
 
WRInaute occasionnel
Les underscore, c'est pas terrible. Je sais que les moteurs les gèrent mieux, mais c'est de toute façon par esthétique.

Une autre solution consisterai à glisser un séparateur en dur qui semble faire partie de l'expression :

-http://www.actualites-electroniques.com/FR-David-Guetta-Track-One-Love

Ici par exemple, on utilise la rubrique comme séparateur puisqu'elle semble écrite en dur dans ton URL.

Tu peux utiliser n'importe quelle autre expression tu type "band" au milieu, ce qui supprimera le problème.

Et comme l'a dit weboblog, sinon, utiliser un séparateur différent tel que l'underscore.

Dernière solution, mais c'est beaucoup plus lourd, utiliser un routeur qui appelle un fichier unique (un bootstrap dans le langage de Zend Framework par exemple), ce qui procure une souplesse totale dans le choix de ses URL, comme c'est le cas pour wordpress.

Mais là attention, c'est une autre démarche.
 
Nouveau WRInaute
Merci de la rapidité rapide de ces réponses, qui cernent bien le probleme.
En effet il s'agit sans doute d'un conflit de tirets.

Tout d'abord, j'ai lu plusieurs articles qui concluent en disant que le tiret "-" est mieux géré par Google qui correspond à un séparateur de mots alors que l'underscore crée une expression unique.
Donc je voudrais garder tous ces tirets "-" dans un souci d'esthetique et de clareté.

De plus j'ai essayé la solution de Mountain Magazin, qui fonctionne avec une limite.
En effet si l'on rentre l'adresse directement comme cela les pages s'affichent correctement de type :
http://www.actualites-electroniques.com/FR-Etienne-de-Crecy-Indemodabl ... -Prix-choc

Par contre si on clique sur un des liens de ma page, la page générée est de la forme:
http://www.actualites-electroniques.com/FR-artiste-Indemodable-titre1-titre2%3E avec un signe à la fin qui est "%3E". Et donc la page ne s'affiche plus. Que signifie cette petite expression?

Par ailleurs, j'aurai vraiment voulu savoir s'il est possible de garder cette ordre : rubrique-artiste-titre1-titre2-...
J'ai cru comprendre que pour le référencement l'ordre des mots n'a pas vraiment de sens. Je voudrais plus garder cette ordre par un souci de lisibilité à nouveau.

Comment puis-je donc procédéer pour rester avec cette forme (langue-rubrique-artiste-titre), ou artiste et titre sont composé de plusieurs mots et de tirets?
L'url récursive serait-elle une solution?
 
WRInaute occasionnel
dj aroy a dit:
Par contre si on clique sur un des liens de ma page, la page générée est de la forme:
http://www.actualites-electroniques.com/FR-artiste-Indemodable-titre1-titre2%3E avec un signe à la fin qui est "%3E". Et donc la page ne s'affiche plus. Que signifie cette petite expression?
C'est un encodage d'URL, probablement lié à un caractère spécial qui traine dans ton code.

Voir php urlencode() et urldecode()

dj aroy a dit:
Par ailleurs, j'aurai vraiment voulu savoir s'il est possible de garder cette ordre : rubrique-artiste-titre1-titre2-...
J'ai cru comprendre que pour le référencement l'ordre des mots n'a pas vraiment de sens. Je voudrais plus garder cette ordre par un souci de lisibilité à nouveau.

Comment puis-je donc procédéer pour rester avec cette forme (langue-rubrique-artiste-titre), ou artiste et titre sont composé de plusieurs mots et de tirets?
L'url récursive serait-elle une solution?
Si tu veux garder cet ordre, par de souci, par contre, il faut soit retirer les tirets des noms d'artistes + morceaux (ce que tu ne veux pas), soit trouver un autre séparateur.

Tu peux faire rubrique-artiste-musique-titredumorceau

Tu remplaces musique par ce que tu veux, pourvu que ce soit écrit en dur. Je crois pas que les URL récursives changeront grand chose, à cause des tirets.

Sinon, reste la solution de revoir complètement l'architecture en utilisant des vues et un routeur, mais là c'est plus la même limonade, via un framework par exemple pour simplifier le travail de développement.
 
Nouveau WRInaute
Tout cela me fait beaucoup réfléchir et vos conseils m'ont été d'une grande aide.

J'ai donc décidé d'opter pour la forme suivante dans le .htaccess :
Code:
RewriteRule ^EN-(.*)-rubrique-(.*)$   EN-rubrique-Archive.php?artiste=$1&titre=$2 [L]

Ce qui me donne donc les adresses suivantes par exemple:
Code:
http://www.actualites-electroniques.com/EN-Soul-Central-Timeless-Strings-of-life

Ainsi, je ne sais pourquoi mais le "%3E" a maitenant disparu et tout fonctionne.

En effet je voulais éviter de mettre des / ce qui m'obligeait à recréer quasiment tous les liens en interne, notamment les includes, à cause de la nouvelle arborescence engendrée.

Enfin afin de nettoyer encore plus mes variables titres et artistes je voudrais utiliser la fonction suivante, découverte sur le forum:
Code:
function convert_for_uri($text) {
  // Définition du séparateur
  define("SEPARATOR", "-");

  $tofind = "àáâãäåòóôõöøèéêëçìíîïùúûüÿñ"; // Lettre accentuées
  $replac = "aaaaaaooooooeeeeciiiiuuuuyn"; // Equivalant non accentué

  // Mise en minuscule + suppression des lettres accentuées par leur équivalant non accentué
  $text = strtr(strtolower($text),$tofind,$replac);

  // Remplacement de caractère non alphanumérique par un séparateur
  $text = ereg_replace("[^a-z0-9]", SEPARATOR, $text);

  // Suppression des doubles séparateurs
  while (strstr($text, SEPARATOR . SEPARATOR)) 
    $text = str_replace(SEPARATOR . SEPARATOR, SEPARATOR, $text);

  // Retour avec suppression d’un possible séparateur en fin de chaîne
  return(ereg_replace(SEPARATOR . "$", "", $text));
}

Malheureusement je ne comprend pas comment intégrer cette fonction. De mes petites connaissance, on doit creer un fichier javascript? Mais apres comment l'appelle t'on dans le code html pour convertir chaque lien?

Encore merci de votre précieuse aide.
 
WRInaute occasionnel
Déjà, c'est du PHP et pas du javascript.

Pour utiliser une fonction, tu place ta fonction dans un fichier php que tu appelle dans ta page avec require_once()

Je tel laisse voir la doc de la fonction.

Ensuite, pour tranformer un texte, tu fais comme suit :

Code:
$text = "Texte où il faut retirer les caractères accentués";

$textSansAccent = convert_for_uri($text);

echo $textSansAccent;

J'espère que ça t'aidera
 
WRInaute impliqué
dj aroy a dit:
En effet je voulais éviter de mettre des / ce qui m'obligeait à recréer quasiment tous les liens en interne, notamment les includes, à cause de la nouvelle arborescence engendrée.

Faux aucun rapport, ce n'est que de la réécriture d'url.
 
Nouveau WRInaute
Merci de ces précisions.
Je vais changer mes liens en fonctions de vos remarques et voir ce que l'on obtient.

Pour la question du / dans les liens j'ai fait un test et apparemment certains de mes fichiers ne sont pas lu
Par exemple une image dont le code est le suivant ne s'affiche plus:
Code:
<img src="Divers/icone-personnage-commentaire.jpg" width="45" height="45"/>

J'ai l'impression que la page va chercher dans le mauvais dossier : style : monsite.com/dossier rubrique/dossier artiste/dossier titre/divers/... et ne trouve donc rien.

D'ou mon option sur garder les tirets et inclure un mote en dur dedans.

Je retravaille donc le tout et vous ferais un retour pour vous confirmer que tout es ok.

Encore merci
 
WRInaute impliqué
Oui bien sur, une fois la page html affichée.. de toutes facons il est bien mieux d'écrire plutot src="/Divers/icone.... que directement src="Divers/icone dans tous les cas, même dans les CSS, cela permet d'éviter ce genre de soucis inutiles.

Mais pour les includes dans php cela ne change absolument rien.

Cela dit je ne suis pas contre l'utilisation d'un mot comme séparateur, bien au contraire il faut utiliser cela pour choisir un mot-clé de ton site, cela ne pourra qu'être bénéfique si ce mot choisi est également présent dans le titre de la page, le corps, etc.
 
Nouveau WRInaute
Exactement,
En tout cas ce forum fut d'une grande aide et je n'hésiterais pas à y revenir.

Je pense notamment le faire pour voir comment bien rediriger mes pages déjà repertorié par Google et dont les chemins ont maintenant changé....
 
Discussions similaires
Haut