Quoi de nouveau pour le rewriting sophistiqué pour le SEO ?

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

On change

Code:
monfichier?mavariable.php=mavaleur
en
Code:
monfichier-mavariable-mavaleur.php

Mais ce qui serait bien, ce serait de pouvoir changer

Code:
monfichier?mavariable.php=mavaleur
en
Code:
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 ?
 
WRInaute occasionnel
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.
 
WRInaute occasionnel
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.
 
WRInaute passionné
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:
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.
 
WRInaute occasionnel
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:
20160817-le-titre-de-ma-page.php
 
WRInaute passionné
Pourquoi pas.

Après tu tape ta bdd avec une condition de recherche
Code:
WHERE url= le-titre-de-ma-page && date_publi = 20160817
 
WRInaute accro
elji a dit:
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 dit:
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 ^^)
 
WRInaute occasionnel
Ah ouais ? Un id serait mieux que la date ?
Bon, j'accepte ce conseil. C'est ce que je vais faire.

Marie-Aude a dit:
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:
ID1-titre-du-premier-article.php
Code:
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 dit:
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...
 
WRInaute accro
Les exemples de rewrite de ce topic utilisent des techniques de 1930 ...
https://www.webrankinfo.com/forum/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.
 
WRInaute passionné
spout a dit:
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 dit:
PS: Il n'y a pas que Apache dans la vie.
Il est là, autant s'en servir.
 
WRInaute occasionnel
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:
/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:
/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 !
 
WRInaute accro
PHP:
<span class="syntaxdefault"></span><span class="syntaxkeyword"><?</span><span class="syntaxdefault">php<br /></span><span class="syntaxkeyword">function&nbsp;</span><span class="syntaxdefault">slug</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$str</span><span class="syntaxkeyword">)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$transliterator&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">Transliterator</span><span class="syntaxkeyword">::</span><span class="syntaxdefault">createFromRules</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"::Latin-ASCII;&nbsp;::Lower;&nbsp;[^[:L:][:N:]]+&nbsp;>&nbsp;'-';"</span><span class="syntaxkeyword">);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span class="syntaxdefault">trim</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$transliterator</span><span class="syntaxkeyword">-></span><span class="syntaxdefault">transliterate</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$str</span><span class="syntaxkeyword">),&nbsp;</span><span class="syntaxstring">'-'</span><span class="syntaxkeyword">);<br />}<br />&nbsp;<br /></span><span class="syntaxdefault">$titles&nbsp;</span><span class="syntaxkeyword">=&nbsp;[<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxstring">"la&nbsp;Megane&nbsp;IV"</span><span class="syntaxkeyword">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxstring">"la&nbsp;Golf&nbsp;VII"</span><span class="syntaxkeyword">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxstring">"moins&nbsp;de&nbsp;20.000&nbsp;€"</span><span class="syntaxkeyword">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxstring">"l'hybride"</span><span class="syntaxkeyword">,<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxstring">"l'hydrogène"</span><span class="syntaxkeyword">,<br />];<br />&nbsp;<br />foreach&nbsp;(</span><span class="syntaxdefault">$titles&nbsp;</span><span class="syntaxkeyword">as&nbsp;</span><span class="syntaxdefault">$title</span><span class="syntaxkeyword">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span class="syntaxdefault">slug</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$title</span><span class="syntaxkeyword">)&nbsp;.&nbsp;</span><span class="syntaxstring">'<br>'</span><span class="syntaxkeyword">;<br />}&nbsp;</span><span class="syntaxdefault"></span>

Code:
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/
 
WRInaute occasionnel
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.
 
WRInaute occasionnel
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:
    $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.
 
WRInaute accro
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.
 
WRInaute occasionnel
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.
 
WRInaute occasionnel
NicolasH a dit:
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.
 
Discussions similaires
Haut