Messages: 266

Enregistré le: 6 Juin 2009

Message le Mar Aoû 16, 2016 15:46

C'est assez facile l'URL rewriting. Une paire de lignes de code dans le .htaccess.

On change

Code: Tout sélectionner
monfichier?mavariable.php=mavaleur

en
Code: Tout sélectionner
monfichier-mavariable-mavaleur.php


Mais ce qui serait bien, ce serait de pouvoir changer

Code: Tout sélectionner
monfichier?mavariable.php=mavaleur

en
Code: Tout sélectionner
le-titre-de-ma-page.php


C'est possible, puisque WordPress le fait, et aussi ce forum sous PHPBB. Il reste que ces techniques ne sont pas du tout évidentes à mettre en place pour le webmaster moyen, sur un site moyen.

Y a t-il quelque chose de nouveau pour faciliter cela ?
Haut
19 Réponses
Messages: 37930

Enregistré le: 7 Juil 2004

Message le Mar Aoû 16, 2016 18:25

Bonjour,

Le titre est récupéré par exemple via la bdd.

Compléments :
http://forum.webrankinfo.com/url-rewriting-avec-parametres-dans-une-ba ... 94473.html
http://forum.webrankinfo.com/fonctions-pour-creer-slug-seo-friendly-ur ... 99376.html
http://forum.webrankinfo.com/recuperer-titre-dans-bdd-mettre-url-t43028.html
http://forum.webrankinfo.com/comment-avoir-les-mots-cles-titre-url-rew ... 91561.html
http://forum.webrankinfo.com/url-rewritting-les-titres-articles-t144870.html
et il y a d'autres sujets similaires.

Cordialement.
Haut
Messages: 18372

Enregistré le: 5 Juin 2006

Message le Mar Aoû 16, 2016 18:37

ça ne se fait pas dans le htaccess, mais via php en récupérant les variables ....
Haut
Messages: 266

Enregistré le: 6 Juin 2009

Message le Mar Aoû 16, 2016 18:57

Oui, c'est ce que j'essaie de faire.
Je suis en ce moment même d'écrire le script pour ajouter un champ à ma base de données.

A partir du champ titre (ex : Le titre de ma page 2 sur le frère Jacques),
j'aurais demain (si tout va bien) un champ lien avec le-titre-de-ma-page-2-sur-le-frere-jacques.php

C'est après que cela se corse, merci pour les liens, je vais les étudier avec attention.
Haut
Messages: 90

Enregistré le: 4 Mai 2016

Message le Mer Aoû 17, 2016 10:04

Bonjour elji,

Le titre dans l'url c'est ce qu'on appelle le slug.

Le principe :

Le rewrite va te permettre d'appeler ton script php avec comme valeur ton titre.
Le titre va être récupéré par ton script et tu vas faire une rechercher d'article par slug en bd via une requête SQL.
Le champ slug ne doit pas autoriser les doublons.
Si le résultat est nulle alors tu rediriges vers une 404. Sinon tu affiches le contenu des champs de la ligne trouvée.

PS : inutile de mettre .php à la fin, ca rallonge le titre pour rien et si un jour tu changes de techno tu devras renommer toutes tes urls.
Haut
Messages: 1966

Enregistré le: 15 Jan 2012

Message le Mer Aoû 17, 2016 12:53

Slt,

Url demandée par l'internaute (et affiché sur le site) : http://www.exemple.com/mon-titre-de-page.html
Toi, tu gères tes data en base de données avec comme champs : ID | Titre | Text | Url
Code: Tout sélectionner
RewriteRule ^([-a-zA-Z0-9]+).html$ /index.php?url=$1

Tu n'a plus qu'à aller chercher les data en fonction de ta variable url que tu traite via $_GET.

Dans ton BO, via php tu gère la non duplication des url de tes articles pour qu'elles soient unique.
Haut
Messages: 266

Enregistré le: 6 Juin 2009

Message le Mer Aoû 17, 2016 16:36

Merci pour ces réponses. Je vois beaucoup mieux le problème, même si je suis encore à la première étape.
Je n'y avais pas pensé (!), mais mon site n'est pas comme WordPress qui crée automatiquement des répertoires pour les années, et des sous-répertoires pour les mois.

Je vais me retrouver avec plus de 5000 articles avec des URLs dans un même répertoire. Mes sites parlant de voitures, il y a un risque énorme d'avoir des articles avec le même titre (ex : "La nouvelle Renault Megane"). Pour éviter tout risque, et ne pas avoir à réfléchir avant d'écrire un nouveau titre, je dois ajouter une variable unique à l'URL.

Je pense ajouter la date, et c'est simple je dois savoir le faire. Mes URLs seront donc du type :

Code: Tout sélectionner
20160817-le-titre-de-ma-page.php
Haut
Messages: 1966

Enregistré le: 15 Jan 2012

Message le Mer Aoû 17, 2016 17:14

Pourquoi pas.

Après tu tape ta bdd avec une condition de recherche
Code: Tout sélectionner
WHERE url= le-titre-de-ma-page && date_publi = 20160817
Haut
Messages: 18372

Enregistré le: 5 Juin 2006

Message le Mer Aoû 17, 2016 17:27

elji a écrit:Merci pour ces réponses. Je vois beaucoup mieux le problème, même si je suis encore à la première étape.
Je n'y avais pas pensé (!), mais mon site n'est pas comme WordPress qui crée automatiquement des répertoires pour les années, et des sous-répertoires pour les mois.

Ce ne sont que des règles de réécriture, à toit d'inventer les tiennes.

elji a écrit:Mes sites parlant de voitures, il y a un risque énorme d'avoir des articles avec le même titre (ex : "La nouvelle Renault Megane"). Pour éviter tout risque, et ne pas avoir à réfléchir avant d'écrire un nouveau titre, je dois ajouter une variable unique à l'URL.

L'ID de l'article est une bonne idée. Et c'est plus fenghsui que la date pour Google News si jamais ça t'intéresse.
En plus, comme l'ID est unique, ça te permet de baser ta réécriture sur un paramêtre unique, sans t'occuper du titre.
Ca ne t'empêche pas de rajouter la date dans l'url.
Mais côté SQL c'est plus léger (surtout que l'ID est normalement un index ^^)
Haut
Messages: 12288

Enregistré le: 23 Nov 2005

Message le Mer Aoû 17, 2016 17:59

Intégrer la date dans les url c'est moche. Mieux vaut un ID our rien du tout (dans ce cas tu te bases sur le seul slug).
Haut
Messages: 266

Enregistré le: 6 Juin 2009

Message le Mer Aoû 17, 2016 19:23

Ah ouais ? Un id serait mieux que la date ?
Bon, j'accepte ce conseil. C'est ce que je vais faire.

Marie-Aude a écrit:Mais côté SQL c'est plus léger (surtout que l'ID est normalement un index ^^)


Cela ne fera pas de différence, puisque j'ai créé un nouveau champ dans ma DB. Un champ lien, extrapolé à partir de l'ID actuel et du champ titre. La colonne contiendra les valeurs :

Code: Tout sélectionner
ID1-titre-du-premier-article.php

Code: Tout sélectionner
ID2-titre-du-second-article.php


Je suis conscient que cela alourdit ma table, mais ensuite cela me permet de faire des requetes simples (moi pas programmeur, moi aimer requêtes simples) qui seront rapides à éxécuter. Accessoirement, ce nouveau champ pourrait à terme devenir une nouvelle clé, même si je n'en ai pas besoin.

NicolasH a écrit:PS : inutile de mettre .php à la fin, ca rallonge le titre pour rien et si un jour tu changes de techno tu devras renommer toutes tes urls.


J'avais oublié de répondre à cela, c'est par habitude. Toutes mes pages depuis plus de 10 ans ont toutes l'extension .php et j'aurais l'impression qu'il y a quelque chose qui manque s'il n'y avait pas cette extension...
Haut
Messages: 8554

Enregistré le: 14 Mai 2003

Message le Mer Aoû 17, 2016 23:13

Les exemples de rewrite de ce topic utilisent des techniques de 1930 ...
http://forum.webrankinfo.com/pratique-htaccess-lire-avant-poser-t13288 ... l#p1217718

http://upshots.org/php/php-regexrouter
https://gist.github.com/dave1010/1214164
http://altorouter.com/
[...]

Pour les URLs avec un slug qui est p-e amené à changer, j'aime bien passer le couple: id et slug afin de faire une redirection 301 si le slug devait à changer. Et juste le slug si on est sûr que ça changera pas.

PS: Il n'y a pas que Apache dans la vie.
Haut
Messages: 1966

Enregistré le: 15 Jan 2012

Message le Jeu Aoû 18, 2016 15:51

spout a écrit:Les exemples de rewrite de ce topic utilisent des techniques de 1930 ...
Grotesque.
L'exemple que je donne fonctionne parfaitement bien.
A lui de gérer derrière en php pour éviter les conflit et les 404.

Et s'il le souhaite, tout faire en php.

Mais aucunement ces techniques sont dépassées.

spout a écrit:PS: Il n'y a pas que Apache dans la vie.

Il est là, autant s'en servir.
Haut
Messages: 266

Enregistré le: 6 Juin 2009

Message le Dim Aoû 21, 2016 12:33

Bon, j'aurais déjà fait plus de 50 tests avec différentes règles de réécriture, et j'hésite encore sur la moins pire.
J'ai en effet des titres avec "la Megane IV" ou "la Golf VII", ce qui ne rend pas trop bien en minuscules. J'ai aussi "moins de 20.000 €", et de nombreuses fois "l'hybride" ou "l'hydrogène", et je supprime l'apostrophe pour me retrouver avec un mot qui n'existe pas...

Pour règler ce problème à l'avenir, j'ai fait le choix d'un slug non dynamique. Ma difficulté actuelle est pour convertir les + de 5000 articles existants. A l'avenir, j'écrirais l'URL de mon choix en même temps que j'écrirais l'article. J'ai un champ lien dans ma BDD (c'est là que j'ai déjà créé et effacé plus de 50 fois différentes valeurs, je connais par coeur la commande pour tout effacer : UPDATE lesactus SET lien = '').

Pour la suite, il reste une chose que je comprend pas.
Je vais avoir de beaux liens du type :

Code: Tout sélectionner
/monrepertoire/monidentifiantunique-le-titre-de-ma-page.php


Mais comment faire pour que ce lien pointe vers les pages actuelles dont l'URL est de type :

Code: Tout sélectionner
/monrepertoire/monfichier.php?mavariable=mavaleur


Je peux mettre une variable "le titre de ma page" dans un GET dans la page monfichier.php mais il faut que je mette une règle de réécriture dans mon .htaccess avant cela, non ?

Merci encore à ceux qui m'aident !
Haut
Messages: 8554

Enregistré le: 14 Mai 2003

Message le Dim Aoû 21, 2016 13:16

Code: Tout sélectionner
<?php
function slug($str)
{
    
$transliterator Transliterator::createFromRules("::Latin-ASCII; ::Lower; [^[:L:][:N:]]+ > '-';");
    return 
trim($transliterator->transliterate($str), '-');
}
 
$titles = [
    
"la Megane IV",
    
"la Golf VII",
    
"moins de 20.000 €",
    
"l'hybride",
    
"l'hydrogène",
];
 
foreach (
$titles as $title) {
    echo 
slug($title) . '<br>';


Code: Tout sélectionner
la-megane-iv
la-golf-vii
moins-de-20-000
l-hybride
l-hydrogene


Src: https://www.matthecat.com/supprimer-les-accents-dune-chaine-en-php/
Haut
Messages: 266

Enregistré le: 6 Juin 2009

Message le Dim Aoû 21, 2016 19:41

Merci pour cette réponse rapide !
Mon script modifiant une base de données, il est différent, de ce type :

$lien = preg_replace("/\s/", '-', $lien);

Mais les caractères spéciaux ne sont pas vraiment un problème. Mon souci est que je ne voudrais que des mot-clés dans mes URLs mais je me retrouve avec des "l", des "iv" et des "vii" (entre autres), bref des trucs qui n'ont aucun sens. Je suppose que ce n'est pas trop grave.

C'est pour la suite que je suis plus embêté, l'exploitation de ce slug.
Haut
Messages: 266

Enregistré le: 6 Juin 2009

Message le Mer Aoû 24, 2016 15:36

Bon, j'aurais pas mal galéré, mais j'ai enfin ce que je voulais. Les règles de réécriture sont les suivantes.

Code: Tout sélectionner
    $string = strtolower(iconv('UTF-8', 'ASCII//TRANSLIT', $data['titre']));
    $string = preg_replace('/[^A-Za-z0-9\- \']/', '', $string);
    $string = str_replace('nbsp',' ',$string);
    $string = str_replace('\'','-',$string);
    $string = str_replace(' ','-',$string);
    $string = str_replace('--','-',$string);
    $string = rtrim($string,'-');


Ce n'est cependant que le départ, puisque dans la nouvelle architecture de mon site, je vais fusionner les entrées de 2 tables. Pour éviter de faire des requêtes trop complexes, je vais alors récupérer toutes les URLs propres telles que mon script les donne, toutes les enregistrer dans une nouvelle colonne de ma table, et ensuite je pourrais faire une requête simple, en demandant juste le titre, le lien et l'image de une pour les plus récentes entrées de mes 2 tables (il y a déjà des URLs en dur dans ma seconde table).

Le seul inconvénient du système est que je serais condamné à écrire moi-même, à la main, mes futurs URLs, mais c'est guère gênant.
Haut
Messages: 12288

Enregistré le: 23 Nov 2005

Message le Mer Aoû 24, 2016 17:31

Avec un peu de JS dans le back office, tu facilement pré-générer le champ url à partir de ce qui est saisi dans le titre.
Haut
Messages: 90

Enregistré le: 4 Mai 2016

Message le Mer Aoû 24, 2016 17:48

Bonjour,

L'id et la date ne sont pas indispensables dans l'url.

Tu peux avoir un slug unique en controllant ce dernier lors de la saisi d'un nouvel article dans le backoffice.
Il reste plus qu'à faire une recherche par slug dans le backend.
Haut
Messages: 266

Enregistré le: 6 Juin 2009

Message le Jeu Aoû 25, 2016 11:54

NicolasH a écrit:Bonjour,

L'id et la date ne sont pas indispensables dans l'url.

Tu peux avoir un slug unique en controllant ce dernier lors de la saisi d'un nouvel article dans le backoffice.
Il reste plus qu'à faire une recherche par slug dans le backend.


Mon souci n'était pas dans les nouveaux articles, mais plutôt dans les anciens. Je ferais peut-etre un script en JS pour mon formulaire de saisie un jour, mais l'important était d'éviter les doublons dans mes vieux articles.

J'ai donc mis en place un slug

id-unique-titre-de-la-page

et c'est bien. Ce problème est résolu.
Haut