Une arborescence virtuelle dans l’URL

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Difficile de faire connaître des pages de votre site en donnant les URLs quelque peu absconses utilisées nativement par SPIP.
Voilà de quoi rendre tout cela bien plus agréable à l’oeil...

Difficile de faire connaître des pages de votre site en donnant les URLs quelque peu absconses utilisées nativement par SPIP. Voilà de quoi rendre tout cela bien plus agréable à l’oeil...

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 :

inc-urls-friendly.php3
Le script de génération des URL

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 :

guess.php3
Script de reconnaissance d’URL

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é.

Notes

[1Urls

[3Voir à ce propos le point numéro 7 de ce message de neoram dans la liste spip-dev

[4Voir sur phpHeaven : http://www.phpheaven.net/article88.html

[5Voir le 404 Research Lab

Discussion

24 discussions

  • Répondre à ce message

  • 2
    Startide

    Voilà, je pense avoir réussi à installer cette superbe contribution, et cela marche pas mal à un détail près : les liens ont de gros soucis :/

    http://www.generations-starwars.com/la_menace_fantome/fiche_technique_de_star_wars_episode_1_-_la_menace_fantome_article1.html

    Pas de CSS ni d’images :(

    Le fichier htaccess a été laissé tel quel à l’origine, je suis hébergé chez sivit.fr

    Quelle solution à ce blem ?

    Autre question : dans le dossier forum j’avais.. mon forum :) Celui ci était planté par le htaccess qui tentait d’appliquer ses règles. J’ai corrigé le soucis avec un sousdomaine : http://forum.monsit.TDL mais bon c’est qu’une solution de secour je pense.

    merci par avance pour votre aide !

    • Bon et bien la solution c’est d’éditer à la main les templates, pardon squelettes, et de changer l’url des différents fichiers pour avoir la bonne ^^

      J’ai le soucis avec les fichiers uploadés via l’interface admin d’ailleurs, ils ont également un lien relatif, faut que je change ca, si qqn sait où ca se trouve ca m’aiderai bien :)

    • Startide

      Voilà j’ai réussi à corriger mon blem d’images par endroits, mais pas partout :(

      Donc pour l’instant je bute sur le logo des articles... Sur l’index du site le logo est bien affiché suite à mes modifications, mais pas encore dans l’article lui même...

      C’est cette entité : (#LOGO_ARTICLE dont je n’arrive pas à retrouver la référence de départ.

      J’ai tenté une recherche pour remonter dans les fonctions de spip, mais le code est trop obscur pour un débutant comme moi.

      je veux remplacer img src="IMG/... qui se trouve par défaut par l’url de mon site en fait ^^

      Merci de votre aide !

    Répondre à ce message

  • 6

    L’ideal serait d’avoir le nom de la rubrique precedent le titre de l’article, cela permet de mieux se reperer dans la navigation du site, non ?

    par exemple :
    http://www.monsite.com/rubrique1/mon_meilleur_article.html

    Répondre à ce message

  • 1

    Bonjour,

    Bravo pour cette contrib ! J’ai enfin réussi à la mettre en oeuvre.

    Voici mon expérience pour ceux qui désire savoir comment faire ;-)

    D’abord, si elle marche comme prévue, ne faites aucun changement. Pour certains cela a l’air de le faire telle quelle !!!

    Pour moi ça n’a pas fonctionné du premier coup. Voici l’explication.

    Je fais toujours d’abord mes tests sur mon site test http://www.lyfoung.com/~test/ pour les appliquer en cas de succès sur mon site de prod http://www.lyfoung.com

    Pour cette contrib particulière, j’ai eu beaucoup de difficultés sur mon site test, c’est parce que c’était un sous répertoire du site principal !!!

    Voici les modifs que j’ai apporté pour obtenir ce que je voulais : http://www.monsite.com/rubrique1/article1.html

    Modifier inc-urls-friendly.php :

    function arborescence($id_rubrique)
    {
    	if ($id_rubrique == 0) {
    		$url = $GLOBALS['meta']['adresse_site'].'/';
    	} else {
    		$result = spip_query("SELECT id_parent, titre FROM spip_rubriques WHERE id_rubrique=$id_rubrique");
    		$row = spip_fetch_array($result);
    //    $url = arborescence($row['id_parent']).($row['id_parent'] != 0 ? text2sys($row['titre']).'/' : '');
        $url = arborescence($row['id_parent']).(text2sys($row['titre']).'/');
        }
    	return $url;
    }

    Sans cela j’avais toujours : http://www.monsite.com/article1.html et non http://www.monsite.com/rubrique1/article1.html (Pour être clair, les secteurs n’apparaissent pas sans cette modif, car lorsque l’article est dans une sous-rubrique on a bien l’arborescence ..)

    Pour les rubriques pas de soucis, on a bien : http://www.monsite.com/rubrique1

    Une dernière remaque pour ceux qui ont leur site en sous répertoire, vous devez écrire ainsi votre htaccess :

    RewriteRule ^.*(article|rubrique|breve|auteur|mot|forum|document)(.*)\.html$ /sousrep/$1\.php?id_$1=$2 [QSA,L]
    RewriteRule ^(.*)site(.*)\.html$        /sousrep/$1site\.php?id_syndic=$2 [QSA,L]
    RewriteRule ^(.*)petition(.*)\.html$    /sousrep/$1petition\.php?id_article=$2 [QSA,L]

    Remarquez qu’il y a /sousrep devant /$1...!

    Tout fonctionnera sauf pour les logos dont la source pointe toujours sur la racine .. -((

    J’ai passé une journée dessus et ma conclusion est que ça ne fonctionne pas. J’ai seulement réussi à ne plus faire marcher spip à force de tout modifier :-((

    Si quelqu’un y est parvenu, merci de partager l’expérience.

    Je crois pour ma part qu’il faudrait un truc comme <base href="#URL_SITE_SPIP"> mais pour src= et non href= ...Genre <base src="#URL_SITE_SPIP"> quoi !!

    Pour que cela fonctionne il faudrait revoir le moteur de spip mais ça c’est une autre histoire ( car même la solution d’origine proposée par spip pose le même souci !!)

    Je n’utilise pas la fonction guess.php, aller comprendre pourquoi, chez moi ça me plante mon site.

    Au fait, vous pourrez voir le résultat sur mes deux sites (ok sur http://www.lyfoung.com/ et non ok et non mis en place sur http://www.lyfoung.com/~test/)
    @+

    Txia

    • Pour les logos, il faut rajouter la ligne suivante dans le .htaccess :
      RewriteRule IMG(.*)$ /IMG/$1 [QSA,L]

      AVANT tout le reste

    Répondre à ce message

  • Bonjour à tous,

    merci pour cette contrib, cependant deux petits problèmes :

    -  Que fait-on du fichier guess.phph3 ? il faut le coper coller quelque part ou le mettre dans un dossier ?

    -  je n’ai pas compris comment regler le problème des ancres, qq pourrait il m’expliquer ?

    Répondre à ce message

  • J’utilise l’URL rewriting decrite dans cette page pour mon site. Mais bizarrement j’ai des pb de référencement que je n’avais pas avec mes anciens sites . Qd Google passe il me référence 1 page puis elle disparait puis d’autres pages et ca disparait... ca fait 1 mois que ca dure et je n’arrive pas a comprendre pourquoi alors que j’avais aucun pb lorsque je n’utilisais pas cette methode... Si qqun a le mm probleme ou une idée je suis preneur lol

    Répondre à ce message

  • 3

    Bonjour,

    MERCI pour cette contribution. Tout fonctionne.

    Juste une chose.... mes ancres nommées (#haut et #bas), haut de page et bas de page, ne sont pas reconnues et renvoient donc par défaut à la page d’accueil du site.
    J’ai placé dans chaque page :

    <base href="#URL_SITE_SPIP" />
    <link href="#URL_SITE_SPIP" />

    Avez vous une idée ?

    merci

    annabelle

    • Salut,

      il te suffit de rajouter le code spip pour acceder à la page de ton article ou celle de ta rubrique avant #haut comme #URL_ARTICLE#haut ou #URL_RUBRIQUE#haut

    • Annabelle

      Cela fait près de 3 mois que le site fonctionne avec la réécriture et c’est PARFAIT ! Et pour les ancres aussi ! Merci.

      Toutefois j’ai un souci : le raccourci typo de SPIP pour les notes de bas de page renvoient à la page d’accueil du site.
      Cela donne un lien du type : http://www.monsite.fr/#nb1

      Je suis sous 1.6 et chez Amen. Dois je réécrire quelque chose dans le script de génération des urls ?

      Avez vous une idée ? bonne année

      annabelle

    • Fabrice

      Voici une solutions qui devrait résoudre le problème des notes, et encore même
      d’autres :

      En fait c’est tout simple :

      Il suffit d’enlever en haut des squelettes :
      <base ref="#URL_SITE_SPIP">

      car c’est cela qui bloque les fonctionnalités évoquées plus haut
      en faisant croire à SPIP que la page courante est http://url-du-site/
      pour toutes les pages.

      et de changer les liens vers les images ( dans les squelettes seulement ) de la manière suivante :

      < ...
      IMG SRC=« #URL_SITE_SPIP/images/rubrique-1_02.gif » WIDTH=593 HEIGHT=9 ALT=« » ...
      >

    Répondre à ce message

  • 1

    Salut

    Ma question est : quand on est sur un hebergeur public, et on n’a pas acces à la config d’Apache, il suffit de créer le .htacces dans tes dossiers du site ?
    Merci de m’eclaircir

    Répondre à ce message

  • 1
    Rob Thorne

    Oui c’est cool , mais j’ai le meme probleme, les sous rubriques apparaissent dans l’url mais pas les rubriques.
    solution svp
    Best,
    Rob

    • Hier soir, ca a marché sauf pour les rubriques, ce matin je trouve <<
      Erreur dans la requête envoyée à MySQL :
      SELECT auteurs.* FROM spip_auteurs AS auteurs,spip_auteurs_articles AS rel_auteurs WHERE auteurs.id_auteur=rel_auteurs.id_auteur AND rel_auteurs.id_article=’15’ AND NOT(auteurs.statut=’5poubelle’) GROUP BY auteurs.id_auteur ORDER BY auteurs.nom
      > Can’t create/write to file ’/tmp/#sql_2cb6_0.MYI’ (Errcode : 13)
      >>
      C’est moi ou mon hoster ?
       :)
      Rob

    Répondre à ce message

  • Tout vas très bien pour mon site sur ouvaton (pour le momment ! - ce site est en construction ! :-) )

    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 :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

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.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom