.htaccess & URL Rewriting : Regle

Consultez la formation URL Rewriting et sites dynamiques de WebRankInfo / Ranking Metrics

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

.htaccess & URL Rewriting : Regle

Message le Mer Jan 18, 2006 11:53

Bonjour à tous,

j'ai besoin de vos lumières en ce qui concerne l'URL rewriting que je pratique déjà mais que je voudrais optimiser.

En effet je travail sur un site basé sur OSCOMMERCE. Ce site à donc des URL incompréhensibles. Aujourd'hui j'aimerais créer une règle générique de base qui s'adapte à mon menu qui est du type :

Code:
Catégorie principale :
index.php?cPath=22

Sous Catégorie de cette catégorie principale :
index.php?cPath=22_27
index.php?cPath=22_28
index.php?cPath=22_29
...

Autres catégories princiaples :
index.php?cPath=36
index.php?cPath=56
...


Leurs sous catégories fonctionnent de la même manière.

Actuellement pour le renommage de ces URL, je ne fait que citer à chaque fois l'URL d'origine et sa règle propre de renommage. Exemple :
Code:

RewriteRule (.*)luminaires\.html$ $1index.php?cPath=22 [L]



Ce qui fait que pour chaque menu et sous menu je suis obligé d'ecrire une regle de ce type qui se repete...

Je voudrais en fait faire qlq regele générique du type :
Tout les menu ayant l'ID 22 sont renommé luminaire.html et tout les sousmenu ayant l'ID 22 + un autre num sont renommé luminaires_mot_cle.html

Y a til une possibilité de créer une regle de ce type afin de ne pas générer un ficier .HTACCESS de 150 lignes ?

Merci d'avance pour vos réponses !

Alex.

magic corp.
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 428
Inscription: 17 Juin 2004

Message le Mer Jan 18, 2006 13:56

Et pourquoi pas :
http://.../cat22-luminaires.html
Avec:
RewriteRule (.*)cat(.+)-.*\.html$ $1index.php?cPath=$2 [L]

Je suis pas un expèrt en rewrite, alors désolé si j'ai fait des erreurs dans ma règle de reécriture. J'ai aussi une boutique OsCommerce et j'utilisais cette metode pour les prduits, mais je ne l'ai pas encors passé en prod et j'ai plus acces à mon .htacces.

Peut-être que cette contrib pourra t'aidé
http://www.oscommerce.com/community/contributions,2796

-Magic-

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

Message le Mer Jan 18, 2006 14:41

Merci pour ta réponse Magic !

ça m'aiguille un peu, néanmoins je me pose quelque questions avec cette regle :

Code: Tout sélectionner
RewriteRule (.*)cat(.+)-.*\.html$ $1index.php?cPath=$2 [L]


Ici on ne lui precise pas quon renome cpath=22 en luminaire... ?

Si tu arrives à mettre la main sur ton fichier HTACCES et que tu peux me donner plus de precisions ça minterresse ;)

Encore merci,

Alex.

magic corp.
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 428
Inscription: 17 Juin 2004

Message le Mer Jan 18, 2006 17:36

Le problême si tu te base que sur le mots "luminaire", c'est que tu doit convertir "luminaire" en numero 22. Si tu veux faire ton rewrite avec un minimum de regle et surtout sans devoir rajouter une regle à chaque nouvelle catégorie, une solution serrai:
Code: Tout sélectionner
RewriteRule (.*)/(.*)\.html$ $1/index.php?cPath=$2 [L]

soit
Code: Tout sélectionner
http://.../luminaire.html

donne
Code: Tout sélectionner
http://.../index.php?cPath=luminaire

Seulement là, dans ton code tu doit gérer que si "cPath" est un text, il faud le trouver dans ta base de donnée (en faisant attention au formatage du text, par ex. les espaces, les accents et autre caractère spéciaux qu'il vaud mieux eviter dans une URL) pour optenir son ID.
Cette solution est valable mais je la trouve prise de tête à réaliser.

Dans le cas que je t'ai exposé dans mon présedant post, le rewrite en question n'est pas très diférant que celui cité plus haut, mais est plus simple à mettre en place, car je garde le "cPath" à l'interieur de mon URL et tu n'as plus besoin de te soucier du text qui suit.
Code: Tout sélectionner
http://.../cat22-luminaires.html
http://.../cat22-toto.html
http://.../cat22-mes_super_luminaires.html

ces trois URL renverrai sur la même catégorie.

Après c'est une question de temps et d'envie.
-Magic-

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

Message le Jeu Jan 19, 2006 9:42

Ah oui je viens de comprendre ta logique !!

C'est super malin en fait comme système... c'est exactement ce qu'il me faut !

En gros je laisse le site tel qu'il est avec l'ID com identifiant (22) et j'ajoute le mot clé de mon choix derriere... c nikel car je peux l'adapter à n'importe quel catégorie ! Trop fort toi ;))

Donc si je reste dans ta logique, pour renommé mes sous catégories du type :
index.php?cPath=22_29

La regle reste la meme ce qui pourrait donner :
Code: Tout sélectionner
http://.../cat22_29-luminaires-lampes.html
Par exemple


Je trouve ça super mais je vois encore un petit soucis... Comment pusi-je faire dans mon code PhP pour modifier mon menu de tel sorte qu'il soit personnalisé selon la catégorie sur laquelle je clic ??

Car dans le premier cas ou l'on garde uniquement le cat22.html ce 'est pas un probleme, on modifie legerement le code pour transformer le cpath=22 en cat22.html et cette regle s'adapte pour tout le menu.

Mais dans le cas ou je choisi un mot clé different par menu, la il faut que je modifie enormement mon code PhP afin qu'il s'adapte non ?

Encore merci pour tes lumières...

Alex.

magic corp.
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 428
Inscription: 17 Juin 2004

Message le Jeu Jan 19, 2006 11:44

Voici le bout de code qui gére mon rewrite pour les produits mais c'est pratiquement le même pour gérer les categories.

Ce code si situer dans le fichier \includes\fonctions\html_output.php

Dans la fonction "tep_href_link("

Code: Tout sélectionner
// Test pour activé ou non le rewriting
if ( (SEARCH_ENGINE_FRIENDLY_URLS == 'true') && ($search_engine_safe == true) ) {
   // Je limite ce rewrite pour le fichier "product_info.php"
   if($page == 'product_info.php') {
      // Je controle si le parametre "products_id" est présent
      $l = ereg('[&\?/]?products_id[=/]([0-9]+)', $parameters, $m);
      // Si oui on fait le rewrite
      if ($l) {
         // Je supprime le parametre en question de la liste des parametres
         $parameters = ereg_replace("[&\?/]?products_id[=/][0-9]+[&/]?", "", $parameters);
         // Et je garde le ID du produit
         $select_item = $m[1];
         
         // Petite requette dans la base de donnée pour avoir le nom du produit
         $the_product_info_query = tep_db_query("select pd.language_id, p.products_id, pd.products_name, p.products_model from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_id = '" . $select_item . "' and pd.products_id = '" . $select_item . "'" . " and pd.language_id ='1'");
         $the_product_info = tep_db_fetch_array($the_product_info_query);
         
         // Je supprime toutes les lettres accentué du nom du produit
         $tofind = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
         $replac = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
         $the_product_info['products_name'] = strtr($the_product_info['products_name'],$tofind,$replac);
         
         // Je convertie le nom en minuscule
         $the_product_info['products_name'] = strtolower($the_product_info['products_name']);
         
         // Je convertie tous se qui n'est pas alphabetique ou numerique en "_"
         $the_product_info['products_name'] = ereg_replace("[^a-zA-Z0-9]", "_", $the_product_info['products_name']);
         
         // Une petite boucle pour corriger les possibles suite de "_"
         while (strstr($the_product_info['products_name'], '__'))
            $the_product_info['products_name'] = str_replace('__', '_', $the_product_info['products_name']);
         
         // Je supprime le dernier caractère si c'est un "_"
         $the_product_info['products_name'] = ereg_replace("_$", "", $the_product_info['products_name']);
         
         // Je crée le nom de la page
         $page = str_replace('product_info', 'p'. $select_item . '_' . $the_product_info['products_name'] , $page);       
      }      
   }   
}

Voici le code complet de ma fonction tep_href_link. Pour ce situer.
Code: Tout sélectionner
// The HTML href link wrapper function
  function tep_href_link($page = '', $parameters = '', $connection = 'NONSSL', $add_session_id = true, $search_engine_safe = true) {
    global $request_type, $session_started, $SID, $HTTP_GET_VARS;

    if (!tep_not_null($page)) {
      die('</td></tr></table></td></tr></table><br><br><font color="#ff0000"><b>Error!</b></font><br><br><b>Unable to determine the page link!<br><br>');
    }

    if ($connection == 'NONSSL') {
      $link = HTTP_SERVER . DIR_WS_HTTP_CATALOG;
    } elseif ($connection == 'SSL') {
      if (ENABLE_SSL == true) {
        $link = HTTPS_SERVER . DIR_WS_HTTPS_CATALOG;
      } else {
        $link = HTTP_SERVER . DIR_WS_HTTP_CATALOG;
      }
    } else {
      die('</td></tr></table></td></tr></table><br><br><font color="#ff0000"><b>Error!</b></font><br><br><b>Unable to determine connection method on a link!<br><br>Known methods: NONSSL SSL</b><br><br>');
    }
      
      if (!tep_session_is_registered('language') && isset($HTTP_GET_VARS['language'])) {
         $select_langue = $HTTP_GET_VARS['language'];
         
      $l = ereg('[&\?/]?language[=/][a-z][a-z]', $parameters, $m);
      if ($l) {
        $parameters = ereg_replace("[&\?/]?language[=/][a-z][a-z]", "", $parameters);
        $select_langue = substr($m[0],-2);
       
      }
      if (tep_not_null($parameters)) {
        $parameters .= "&language=" . $select_langue;
      } else {
        $parameters = "language=" . $select_langue;
      }
    }
      
      if ( (SEARCH_ENGINE_FRIENDLY_URLS == 'true') && ($search_engine_safe == true) ) {
      if($page == 'product_info.php') {
            $l = ereg('[&\?/]?products_id[=/]([0-9]+)', $parameters, $m);
            if ($l) {
               $parameters = ereg_replace("[&\?/]?products_id[=/][0-9]+[&/]?", "", $parameters);
               $select_item = $m[1];
               
               $the_product_info_query = tep_db_query("select pd.language_id, p.products_id, pd.products_name, p.products_model from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd where p.products_id = '" . $select_item . "' and pd.products_id = '" . $select_item . "'" . " and pd.language_id ='1'");
               $the_product_info = tep_db_fetch_array($the_product_info_query);
               
               $tofind = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
               $replac = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
               $the_product_info['products_name'] = strtr($the_product_info['products_name'],$tofind,$replac);
               
               $the_product_info['products_name'] = strtolower($the_product_info['products_name']);
               
               $the_product_info['products_name'] = ereg_replace("[^a-zA-Z0-9]", "_", $the_product_info['products_name']);
               
               while (strstr($the_product_info['products_name'], '__'))
                  $the_product_info['products_name'] = str_replace('__', '_', $the_product_info['products_name']);
                  
               $the_product_info['products_name'] = ereg_replace("_$", "", $the_product_info['products_name']);
                           
               $page = str_replace('product_info', 'p'. $select_item . '_' . $the_product_info['products_name'] , $page);       
            }      
         }   
      /*while (strstr($link, '&&')) $link = str_replace('&&', '&', $link);

      $link = str_replace('?', '/', $link);
      $link = str_replace('&', '/', $link);
      $link = str_replace('=', '/', $link);

      $separator = '?';*/
    }
      
    if (tep_not_null($parameters)) {
      $link .= $page . '?' . tep_output_string($parameters);
      $separator = '&';
    } else {
      $link .= $page;
      $separator = '?';
    }

    while ( (substr($link, -1) == '&') || (substr($link, -1) == '?') ) $link = substr($link, 0, -1);

// Add the session ID when moving from different HTTP and HTTPS servers, or when SID is defined
    if ( ($add_session_id == true) && ($session_started == true) && (SESSION_FORCE_COOKIE_USE == 'False') ) {
      if (tep_not_null($SID)) {
        $_sid = $SID;
      } elseif ( ( ($request_type == 'NONSSL') && ($connection == 'SSL') && (ENABLE_SSL == true) ) || ( ($request_type == 'SSL') && ($connection == 'NONSSL') ) ) {
        if (HTTP_COOKIE_DOMAIN != HTTPS_COOKIE_DOMAIN) {
          $_sid = tep_session_name() . '=' . tep_session_id();
        }
      }
    }

   
      
    if (isset($_sid)) {
      $link .= $separator . tep_output_string($_sid);
    }

    return $link;
  }

-Magic-

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

Message le Jeu Jan 19, 2006 11:47

Super ! merci bocou magic je vais regarder ce superbe code commenté et ladapater !

Donc en gros il compare l'ID au nom de la catégorie et c ce nom qui fait office de mot clé ?

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

Message le Jeu Jan 19, 2006 12:09

Et ton code pour la page product_info est terrible aussi en passant, ça veux dire qu'en créant la même regle (que j'ai un peu modifié... dit moi si elle te parait juste) :

Code: Tout sélectionner
RewriteRule (.*)*-(.+)\.html$ $1/product_info.php?products_id=$2 [L]


J'aurais grace a ton code PhP, une page du type :
Code: Tout sélectionner
tabouret-225.html


Si c ça, c'est nikel, parceque javais meme pas osé renommer les pages produits... lol

Alex.

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

Message le Jeu Jan 19, 2006 16:48

tu repond plus du coup ;)

Je peux enlever le cat ? pour ne laisser que le numero du produit ou de la categorie pour donner ça :

Code: Tout sélectionner
RewriteRule (.*)*-(.+)\.html$ $1index.php?cPath=$2 [L]

ce qui donnerait :
http://.../luminaires-22.html

Je ne pense pa que ca pose probleme mais bon...

magic corp.
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 428
Inscription: 17 Juin 2004

Message le Jeu Jan 19, 2006 22:36

Salut

Ma machine est HS depuis une semaine et j'ai plus accés en direct live à mes mail pour voir si il y des reponse sur les post auquel j'ai repondu. Désolé du retard :D

Le problême si tu vire le "cat" ou un autre prefixe (ou sufixe), c'est comment vas tu savoir si c'est un produit ou une catégorie.

Dans cette exemple, comment savoir le quel des deux est un produit ou une categorie : :?
luminaire-22.html
tabouret-225.html

Alors qu'avec un petit prefixe tu as deux regle bien distincte
Une catégorie
Code: Tout sélectionner
luminaire-c22.html
RewriteRule (.*)*-c(.+)\.html$ $1/index.php?cPath=$2 [L]

Un produit
Code: Tout sélectionner
tabouret-p225.html
RewriteRule (.*)*-p(.+)\.html$ $1/product_info.php?products_id=$2 [L]


Vois-tu où je veux en venir ?
-Magic-

rigolman
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 26
Inscription: 5 Sep 2005

Message le Ven Jan 20, 2006 10:05

ah la loose l'accès internet... j'ai été bloqué 1 mois lorsque jai changé de provider !!

je vois tout à fait ce que tu veux dire... c'est logique en plus, donc je vais garder un petit prefixe comme tu las mis CAD une lettre (c & p) pour ne pas avoir des URL trop longues !

Je viens de tester et ça marche nikel, je vais enfin pourvoir avoir un site avec des pages indexé correctement...

En tout cas merci beaucoup pour ton aide et tes conseils, j'y vois maintenant beaucoup plus clair !

Si tas besoins de quoi que se soit, hesites pas !

Alex.


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Formation recommandée sur ce thème :

Formation URL Rewriting et sites dynamiques : apprenez comment mettre en place la réécriture d'URL, comment optimiser vos URL et profiter de vos pages dynamiques pour booster votre référencement. Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :

Consultez la description détaillée des produits ou services de Google suivants : Google goo.gl

  • Liste des backlinks
    Cet outil vous permet d'analyser en détails la "popularité" de votre site sur Google. En plus du nombre de liens pris en compte par Google, il calcule le pourcentage de liens internes parmi tous les liens, et il affiche les premières URL trouvées.
  • Transformer des textes non cliquables en liens
    Cet outil vous permet de trouver des pages citant votre site mais ne faisant pas (encore) de lien. Il suffira parfois d'un simple mail pour transformer cette simple citation en lien (backlink).


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité