J’en avais assez de donner à mes utilisateurs de phpMyChat une URL du type suivant :
http://www.phpheaven.net/rubrique.php3?id_rubrique=14
J’ai donc regardé ce qui est faisable avec la gestion d’URL de SPIP, et en m’inspirant des contributions de Fil [1] et Dan Hetzel [2], je peux maintenant leur fournir une URL bien plus simple :
http://www.phpheaven.net/projects/phpmychat/rubrique14.html
Et je peux même aller plus loin pour une rubrique, avec une URL encore plus simple :
http://www.phpheaven.net/projects/phpmychat/
Un avantage supplémentaire est que ce type d’URL est à priori recommandé pour faciliter le référencement d’un site [3].
Comment ça marche ?
Déjà, voyons comment générer de telles URL
La génération des URL utilisées par SPIP via les tags #URL_ARTICLE
ou #URL_RUBRIQUE
se configure via le script inc-urls.php3
.
Pour phpHeaven, j’ai donné à ces URL le nom friendly.
J’ai donc créé un fichier inc-urls-friendly.php3
, que vous pouvez télécharger ci-dessous :
J’ai ensuite fait référence à ce script dans inc-urls.php3
avec la ligne suivante :
$type_urls = 'friendly';
Voyons un peu ce que fait ce script :
- Une première fonction nommée text2sys
transforme toute chaîne de caractères en une chaîne plus simple, sans caractères spéciaux, accents ni caractères d’espacement. Ainsi, Chronique d'une licence non annoncée
[4] devient chronique_d_une_licence_non_annoncee
. Cette fonction utilise les capacités de translitération de SPIP 1.6, ce qui devrait lui permettre d’être aussi utilisée pour toutes les langues.
- une seconde fonction nommée arborescence
génère récursivement l’arborescence virtuelle de la rubrique correspondant à l’identifiant passé en paramètre, en transformant tous les noms de rubriques via la fonction text2sys
- enfin, les fonctions classiques de génération d’URL qui seront appelées par SPIP s’appuient sur arborescence
pour générer les URL complètes
Prévoyons maintenant le traitement de ces URL
Dans la configuration de Apache (.htaccess
ou httpd.conf
) :
RewriteEngine On
# Pas de reecriture pour certaines ressources
RewriteRule \.(gif|jpg|png|css|php|php3) - [NC,L]
RewriteRule ^(ecrire|IMG|NAVPICS|oo)/ - [NC,L]
# Gerer les URLs SPIP
RewriteRule ^.*(article|rubrique|breve|auteur|mot|forum)(.*).html$ /$1.php3?id_$1=$2 [QSA,L]
RewriteRule ^(.*)site(.*).html$ $1site.php3?id_syndic=$2 [QSA,L]
# Gerer les URL inconnues
RewriteRule ^(.+/.*)$ guess.php3?url=$1 [QSA,L]
Tout d’abord, on indique de ne pas transformer les URL qui correspondent à des ressources accessibles directement, telles que les images, les feuilles de style ou tout simplement les scripts PHP.
De la même manière, on indique de ne pas transformer les URL correspondant à des éléments ne se trouvant pas à la racine du site.
Ensuite, on traite le cas général des URL qui contiennent un des termes suivants :
- article
- rubrique
- breve
- auteur
- mot
- forum
On remplace ainsi toute URL ...nimportequoi_rubrique14.html
par /rubrique.php3?id_rubrique=14
.
Vous noterez que l’identifiant d’un site syndiqué se notant id_syndic
et non id_site
, il faut traiter ce cas à part. Pour le traiter en même temps, l’alternative serait de renommer les fichiers site.php3
et site-dist.html
en syndic.php3
et syndic-dist.html
et d’en tenir compte dans la génération des URL.
Et ce guess.php3
alors ???
Comme nous l’avons vu, il est possible pour les rubriques d’utiliser des URL simplifiées telle que celle-ci :
http://www.phpheaven.net/projects/phpmychat/
Les éléments étant normalement identifiés par la présence en fin d’URL d’une partie telle que rubrique14.html
, il fallait trouver un moyen de reconnaître à quelle rubrique l’URL ci-dessus fait référence.
L’idée à été de créer un script qui cherche parmi les cas possibles si l’un correspond à l’adresse demandée.
Voilà le script à télécharger :
Ce script qui est donc utilisé dans le cas où l’URL n’a pas pu être reconnue, parcours l’ensemble des rubriques de SPIP en tentant d’y reconnaître l’URL demandée.
En cas de succès, l’internaute est redirigé vers l’URL complète, et en cas d’echec il est redirigé vers la page d’accueil du site. Il serait possible bien entendu de générer plutôt une erreur 404 [5] pour indiquer la non disponibilité de la page demandée.
Aaaah, mes images ne s’affichent plus !
Pas de panique, ce sont seulement les URL relatives à l’intérieur des pages HTML qui ne sont plus valides.
Avec les URL classiques de SPIP, il n’y a pas de répertoire dans l’URL par rapport à la racine du site, donc il suffit de référencer les images, feuilles de styles, sources JavaScript, etc. en relatif, avec uniquement le nom du fichier s’il est dans cette même racine.
Quand le navigateur reçoit une page telle que http://www.phpheaven.net/projects/phpmychat/rubrique14.html
, si le code HTML contient <img src="puce.gif" />
, il va tout simplement demander au serveur le fichier http://www.phpheaven.net/projects/phpmychat/puce.gif
, qui n’existe à priori pas.
Il faut donc utiliser des URL absolues (i-e complètes) pour faire référence aux éléments externes, par exemple ici <img src="/puce.gif" />
, ou ajouter l’élément <base href="#URL_SITE_SPIP" />
dans l’en-tête HTML.
Ce problème n’est pas présent pour les documents et images contenus dans les articles, leurs URL étant générées par inc-urls-friendly.php3
, mais il est présent pour les vignettes, pour lesquelles ce code n’est pas utilisé.
Discussions par date d’activité
24 discussions
J’ai essayé d’adapter ce script pour un site non SPIP
Il n’y a pas moyen que ça marche...
Je pense que le pb vient de l’hébergeur, à savoir Online.net
Avec le fichier .htaccess transformé, ça donne un msg d’erreur. (même en ne mettant que la 1e ligne « RewriteEngine On »)
Voilà le msg :
— -
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, webmaster@proxad.net and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
— -
Comment faire qq chose de similaire chez Online ?
Autrement, je trouve ça génial !
Répondre à ce message
excellent !
j’ai améliorer un petit peu la forme dans le fichier inc-urls-friendly :
dans chaque fonction :
$url = arborescence($id_rubrique).’_r’.$id_rubrique.’.html’ ;
return $url ;
j’ai remplacé les termes ’rubrique’ par ’_r’,’article’ par ’_a’ ...etc
ce qui donne :
www.monsite.com/le-nom-de-mon-article_a115.html
ou
www.monsite.com/ma-rubrique_r54.html
..et pareil pour tout les autres termes (breves -> _b, auteur -> ’_au’,mot -> ’_m’ ...)
par contre, j’ai pris le ’-’ pour séparateurau lieu du ’_’, pour pas avoir de conflit avec un nom d’article
il faut aussi modifier les .htaccess en fonction :
# Gerer les URLs SPIP
RewriteRule ^.*(_a)(.*).html$ /article.php3 ?id_article=$2 [QSA,L]
RewriteRule ^.*(_r)(.*).html$ /rubrique.php3 ?id_rubrique=$2 [QSA,L]
RewriteRule ^.*(_b)(.*).html$ /breve.php3 ?id_breve=$2 [QSA,L]
RewriteRule ^.*(_au)(.*).html$ /auteur.php3 ?id_auteur=$2 [QSA,L]
RewriteRule ^.*(_m)(.*).html$ /mot.php3 ?id_mot=$2 [QSA,L]
RewriteRule ^.*(_f)(.*).html$ /forum.php3 ?id_forum=$2 [QSA,L]
on peut auusi rajouter la gestion de l’erreur 404&403
# Gerer les erreurs 404
ErrorDocument 404 /404.php3
ErrorDocument 403 /403.php3
en tout cas, merci pour la contrib de départ :)
Pour voir le résultat : www.prisonsoup.com
avec ton système, il faut au moins avoir
http://example.com/_a42.html
je trouve ça moins pratique que
http://example.com/article42.html
On est d’accord sur un titre court, ca sert a rien, mais sur des long titres, je pense que ca se justifie
je me suis inspiré du site du ministère de l’agriculture ;)
http://www.agriculture.gouv.fr/spip/
Abasourdi devant ton expression « en tout cas, merci pour la contrib de départ :) » même avec le simley
De toute façon, tout ça a déjà été fait mille fois ici ou ailleurs, mais faut bien réexpliquer dix-mille fois pour que ça se diffuse. Alors à abasourdi, abasourdi et demi ... et je vous embrasse tous bien fort !
Abasourdi devant ton expression « en tout cas, merci pour la contrib de départ :) » même avec le simley
t’aurais préféré quoi ? pas de remerciement du tout :-o ?
Répondre à ce message
Bonsoir,
Cela ne fonctionne pas dans mon cas.
Lorsque l’on survole le titre d’un article, j’ai bien l’url : « titre_de_mon_article.. » qui s’affiche dans la barre d’état.
Par contre j’ai une erreur 404 au telechargement de l’article.
L’hebergeur est amen.
J’ai testé le fonctionnement de la reecriture d’url comme indiqué dans japonim.net et cela fonctionne.
Cordialement,
Eric
adresse du site : opalesurf.webhop.org
les modifs apportées à .htaccess :
# Gerer les URLs SPIP
RewriteRule ^.*(article|rubrique|breve|auteur|mot|forum)(.*).html$ $1.php3 ?id_$1=$2 [QSA,L]
RewriteRule ^(.*)site(.*).html$ /$1site.php3 ?id_syndic=$2 [QSA,L]
suppression de / avant « $1site.php3 ?id_syndic=$2 [QSA,L] »
ajout de la balise : < base href="http://opalesurf.webhop.org/" / >
dans chaque fichier de squelette article.html ....
L’affichage de sous repertoires pour les sous rubriques fonctionne également.
Cordialement,
Eric
salut
j’ai exactement les même galères que toi, mais j’ai copier coller tes modifs htaccess c’est à dire supprimer l’espace avant le slash (/), et rien ni fait.
J’aurais manquer quelques chose ?
Sinon BRAVO nicolas, depuis le temps que je galère avec les urls simplifiés.
Répondre à ce message
J’utilise plusieurs sites spip sur le même serveur.
J’ai choisi d’installer les redirections pour le spip installé sur le repertoire
www.monsite.ext/spiptests/
Tout semble baigner sauf que les liens me redirigent sur www.monsite.ext/larubrique.html
www.monsite.ext/larticle.html
au lieu de
www.monsite.ext/spiptests/larubrique.html
www.monsite.ext/spiptests/larticle.html
En clair je suis redirigé sur les articles ou les rubriques d’un autre site installé à la racine.
Je cherche une soluc’ :-(
C’’est corrigé mais çà ne marche pas encore pour les articles de sous rubriques et les appels de sous rubriques.
J’ai modifié les directives :
RewriteEngine On
# Pas de reecriture pour certaines ressources
RewriteRule \.(gif|jpg|png|css|php|php3) - [NC,L]
RewriteRule ^(ecrire|IMG|NAVPICS|oo)/ - [NC,L]
# Gerer les URLs SPIP
RewriteRule ^.*(article|rubrique|breve|auteur|mot|forum)(.*)\.html$ $1.php3 ?id_$1=$2 [QSA,L]
RewriteRule ^(.*)site(.*)\.html$ $1site.php3 ?id_syndic=$2 [QSA,L]
# Gerer les URL inconnues
RewriteRule ^(.+/.*)$ guess.php3 ?url=$1 [QSA,L]
Répondre à ce message
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Suivre les commentaires : |