Un nom de fichier sympa pour vos articles

Comment aller plus loin avec les .htaccess et SPIP

Un nom de fichier sympa pour vos articles

Le samedi 14 juin 2003 par Dadoo

Vous pouvez constatez sur ce site que les fiches de lectures ont des noms qui reprennent le titre de l’article. Cela permet d’améliorer le référencement en utilisant le poids que donne Google et d’autres moteurs au nom du fichier. Pour cela Spip permet de calculer ses propres URL et ensuite le fichier .htacccess sous Apache permet de refaire le lien avec le vrai fichier PHP.

Mais prenons plutôt un exemple : l’article Métaphysique des Tubes de Amélie Nothomb est accessible par l’url M%E9taphysique%20des%20Tubes=508.html. On retrouve donc dans l’URL le titre du roman étudié.

Pour parvenir à ce résultat j’ai utilisé la fonction "Utiliser des URLs personnalisées" de la documentation de SPIP.

Il suffit ensuite d’agrémenter son fichier inc-urls-XXX.php3.

Pour ma part je voulais utiliser le titre de l’article. le code à intégrer est donc :


function generer_url_article($id_article) {
        if (! $id_article) $id_article = 0;       
        $result = spip_query("SELECT id_secteur,titre FROM spip_articles WHERE id_article=$id_article");
        $row = spip_fetch_array($result);
        $id_secteur = $row['id_secteur'];
        $titre = trim($row['titre']);
        $url = "article$id_article.html";
        if ($GLOBALS['recherche']) $url .= "?var_recherche=".urlencode($GLOBALS['recherche']);
        return $url;
}

Du coup chacune des URL d’articles calculée par SPIP reprendra le titre de l’article.

On garde cependant le numéro de l’article dans l’URL afin de conserver un identifiant unique facile à repérer.

Il reste ensuite à faire comprendre au serveur web comment décrypter cette URL. Cela se passe dans le fichier .htaccess :


Options +FollowSymlinks
RewriteEngine on
RewriteRule ^([^=]*)=([0-9]+).html$    /article.php3?id_article=$2 [QSA,L]

Ainsi le serveur web comprend que la page M%E9taphysique%20des%20Tubes=508.html est en fait article.php3 ?id_article=508 !

Attention : ceci peut ne pas fonctionner si vous avez certains caractères reservés dans vos titres (par exemple des " ?").



  • > Universaliser la règle de réécriture  12 janvier 2004, par philippe

    merci pour ce script, ça fonctionne très bien Par contre ces règles de réécriture fonctionnent seulment pour la page article. Sur ma page plan.php3 je vois toutes les urls quand je passe en rollover sur les liens Pour les liens des rubriques cela donne rubrique12.html par exemple. Que faut-il rajouter pour que les liens focntionnent avec les rubriques, les brèves... Pour l’instant ça renvoit vers des erreurs 404

    Merci Philippe


    Répondre à ce message
    • > Universaliser la règle de réécriture 12 janvier 2004, par Dadoo

      Il faut créer des règles équivalentes pour chacune des pages, attention dans ce cas il faut créer un nommage particulier du genre :

      article-NOM-numero.html et rubrique-NOM-numero.html pour que le système distingue les deux cas de figure.


      Répondre à ce message
      • > Universaliser la règle de réécriture 12 janvier 2004, par philippe

        merci pour ta réponse Pour être plus précis voici ce que j’ai fait

        dans le fichier htaccess :

        RewriteEngine on
        RewriteRule ^([^=]*)=([0-9]+).html$ /SPIP/article.php3 ?id_article=$2 [QSA,L]

        et dans un fichier inc-urls-titrehtml.php3 :

        function generer_url_article($id_article) if ( ! $id_article) $id_article = 0 ; $result = spip_query("SELECT id_secteur,titre FROM spip_articles WHERE id_article=$id_article") ; $row = spip_fetch_array($result) ; $id_secteur = $row[’id_secteur’] ; $titre = trim($row[’titre’]) ; $url = "".translitteration(nettoyerURL($titre)). "=$id_article.html" ; if ($GLOBALS[’recherche’]) $url .= " ?var_recherche=".urlencode($GLOBALS[’recherche’]) ; return $url ;

        donc j’imagine qu’il faut faire une fonction rubrique identique à celle pour article
        et dans htaccess
        ajouter :
        RewriteRule ^([^=]*)=([0-9]+).html$ /SPIP/rubrique.php3 ?id_article=$2 [QSA,L]

        C’est ça ?


        Répondre à ce message
  • > Un nom de fichier sympa pour vos articles  20 août 2003

    Salut,

    J’arrive à reécrire les url SPIP en extension html. Néanmoins, je bloque sur l’affichage du titre dans l’url.

    Est-ce dans la function recuperer_parametres_url qu’il manque un paramètre ?

    Mon fichier .Htaccess le RewriteRule tel qu’il est donné sur livres-online donne des erreurs 404

    Options +FollowSymlinks RewriteEngine on RewriteRule ^article([0-9]+)\.html$ article\.php ?id_article=$1 [QSA,L] RewriteRule ^breve([0-9]+)\.html$ breve\.php ?id_breve=$1 [QSA,L] RewriteRule ^rubrique([0-9]+)\.html$ rubrique\.php ?id_rubrique=$1 [QSA,L] RewriteRule ^forum([0-9]+)\.html$ forum\.php ?id_forum=$1 [QSA,L] RewriteRule ^mot([0-9]+)\.html$ mot\.php ?id_mot=$1 [QSA,L] RewriteRule ^auteur([0-9]+)\.html$ auteur\.php ?id_auteur=$1 [QSA,L] RewriteRule ^document([0-9]+)\.html$ document\.php ?id_document=$1 [QSA,L]

    Mon fichier inc-urls

    <?php

    // executer une seule fois if (defined("_INC_URLS2")) return ; define("_INC_URLS2", "1") ;

    /*function generer_url_article($id_article) return "article$id_article.html" ; */

    function generer_url_article($id_article) if ( ! $id_article) $id_article = 0 ; $result = spip_query("SELECT id_secteur,titre FROM spip_articles WHERE id_article=$id_article") ; $row = spip_fetch_array($result) ; $id_secteur = $row[’id_secteur’] ; $titre = trim($row[’titre’]) ; $url = "article$id_article.html" ; if ($GLOBALS[’recherche’]) $url .= " ?var_recherche=".urlencode($GLOBALS[’recherche’]) ; return $url ;

    function generer_url_rubrique($id_rubrique) return "rubrique$id_rubrique.html" ;

    function generer_url_breve($id_breve) return "breve$id_breve.html" ;

    function generer_url_forum($id_forum) return "forum$id_forum.html" ;

    function generer_url_mot($id_mot) return "mot$id_mot.html" ;

    function generer_url_auteur($id_auteur) return "auteur$id_auteur.html" ;

    function generer_url_document($id_document) if ($id_document > 0) $query = "SELECT fichier FROM spip_documents WHERE id_document = $id_document" ; $result = spip_query($query) ; if ($row = spip_fetch_array($result)) $url = $row[’fichier’] ; return $url ;

    function recuperer_parametres_url($fond, $url) global $contexte ; return ;

     ?>


    Répondre à ce message
    • > Un nom de fichier sympa pour vos articles 20 août 2003

      Je pense qu’il faut déjà modifier cette partie : $url = "article$id_article.html" et la remplacer par :


      $url = "".translitteration(nettoyerURL($titre)). "=$id_article.html";

      en ajoutant la fonction :


      function nettoyerURL($chaine){
              $chaine = str_replace(" ","_",$chaine);
              $chaine = str_replace("-","_",$chaine);
              $chaine = str_replace(".","_",$chaine);
              $chaine = str_replace("'","_",$chaine);
              return $chaine;
      }

      dans le fichier inc_url

      Quant à l’erreur 404, c’est que la directive inscrite ne correspond pas à la règle que tu avais mis dans ton inc_url mais à celle qui est ci-dessus.

      Pour la règle de nommage que tu avais utilisé il faut mettre la directive suivante :

      RewriteRule ^article([0-9]+).html$    /article.php3?id_article=$1 [QSA,L]


      Répondre à ce message
      • > Un nom de fichier sympa pour vos articles 20 août 2003

        Sympa d’avoir répondu.

        La fonction translitteration n’est pas définie.

        Fatal error : Call to undefined function : translitteration() in /home/httpd/www/web/spptests/inc-urls-chris.php3 on line 27


        Répondre à ce message
        • > Un nom de fichier sympa pour vos articles 20 août 2003, par Dadoo

          Comme le disait Fil dans le commentaire ci dessous il faut inclure un fichier dans inc_url :

          include_ecrire(’inc_charsets.php3’) ;


          Répondre à ce message
    • > Un nom de fichier sympa pour vos articles 9 septembre 2003
      Je suis dans le même cas que toi Qqun a une solution ?
      Répondre à ce message
  • > pkoi faire l’id secteur ?  23 juin 2003, par Dadoo
    C’est un résidu du code de mon site où je n’utilise cette "astuce" que pour un secteur...
    Répondre à ce message
  • pkoi faire l’id secteur ?  22 juin 2003, par silicium
    je vois que ta requete récupère titre et id_secteur en fonction d’id article. pourquoi faire id_secteur ? tu ne t’en sers pas du tout...
    Répondre à ce message
  • > Un nom de fichier sympa pour vos articles  18 juin 2003, par Fil

    Oui, j’ai fait ça aussi ;) Toutefois, c’est plus joli si on utilise la fonction translitteration() disponible dans inc_charsets (ajouter la ligne include_ecrire('inc_charsets.php3'); ) ; ensuite, il faut transformer les espaces et caractères étranges en _, et virer les /, sinon on risque des surprises.

    PS : très joli site !


    Répondre à ce message
  • > Un nom de fichier sympa pour vos articles  18 juin 2003

    et comment faire pour remplacer les espaces, ici codés avec %20, par des underscore ?? en effet, il serait plus sympa d’avoir, à titre d’exemple, le_journal_du_jour508.html plutot que le%20journal%20du%20jour508.html, non ??

    c juste une idée, je ne sais pas si elle est réalisable... merci !


    Répondre à ce message
  • sale copiteur !  17 juin 2003, par silicium
    eh mais tu as fait ce que j’avais prévu. voleur d’idée :) bon bin j’ai rien à développer du coup. je veux tester. si ca marche bien, je ferais un lien depuis SpipOjapanim sur cet article.
    Répondre à ce message