.htaccess & URL Rewriting : Regle

Nouveau WRInaute
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.
 
WRInaute occasionnel
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-
 
Nouveau WRInaute
Merci pour ta réponse Magic !

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

Code:
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.
 
WRInaute occasionnel
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:
RewriteRule (.*)/(.*)\.html$ $1/index.php?cPath=$2 [L]
soit
Code:
http://.../luminaire.html
donne
Code:
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:
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-
 
Nouveau WRInaute
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:
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.
 
WRInaute occasionnel
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:
// 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:
// 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-
 
Nouveau WRInaute
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é ?
 
Nouveau WRInaute
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:
RewriteRule (.*)*-(.+)\.html$ $1/product_info.php?products_id=$2 [L]

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

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

Alex.
 
Nouveau WRInaute
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:
RewriteRule (.*)*-(.+)\.html$ $1index.php?cPath=$2 [L]
ce qui donnerait :
http://.../luminaires-22.html

Je ne pense pa que ca pose probleme mais bon...
 
WRInaute occasionnel
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:
luminaire-c22.html
RewriteRule (.*)*-c(.+)\.html$ $1/index.php?cPath=$2 [L]
Un produit
Code:
tabouret-p225.html
RewriteRule (.*)*-p(.+)\.html$ $1/product_info.php?products_id=$2 [L]

Vois-tu où je veux en venir ?
-Magic-
 
Nouveau WRInaute
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.
 
Discussions similaires
Haut