Votre avis sur mon rewriting svp

  • Auteur de la discussion Auteur de la discussion tryan
  • Date de début Date de début
WRInaute passionné
Bonjour,

Je "m'amuse" à un créer un petit CMS et je doute de mon url rewriting.

L’architecture est simple :
catégories » sous-catégories » articles

Les catégories sont sous la forme : /categorie-id-titre/

Les sous-catégories sont sous la forme : sous-categorie-id-titre/
Les sous catégories disposent d'une pagination qui ajoute par exemple : page2

Les articles sont sous la forme : titre-id.php.

Mon rewriting est le suivant :

Code:
RewriteEngine on
RewriteBase /

#Rewrite des sous-catégories avec pagination 
RewriteRule  ^categorie-([0-9]*)-([^/]*)/sous-categorie-([0-9]*)-([^/]*)/page([0-9]+)$  /sous-categorie.php?idcat=$1&nomcat=$2&id=$3&nomsouscat=$4&page=$5 [L] 

#Rewrite des sous-catégories sans pagination 
RewriteRule  ^categorie-([0-9]*)-([^/]*)/sous-categorie-([0-9]*)-([^/]*)/$  /sous-categorie.php?idcat=$1&nomcat=$2&id=$3&nomsouscat=$4 [QSA] 
 
#Rewrite des catégories
RewriteRule  ^categorie-([0-9]*)-([^/]*)/?$  /categorie.php?id=$1&categorie=$2 [L]
 
#Rewrite des pages
RewriteRule  ^categorie-([0-9]*)-([^/]*)/sous-categorie-([0-9]*)-([^/]*)/(.*)-([0-9]*)\.php$  /page.php?idcat=$1&nomcat=$2&id=$3&nomsouscat=$4&titre=$5&id=$6 [L]
Bien que cela fonctionne, j'aimerais avoir vos avis afin de voir si on peut faire mieux svp.
Merci
 
WRInaute passionné
Merci spout.

Bon, j'ai lus, relus et testés quelques trucs sans succès car il y a un truc qui m'échappe dans les 3 liens.

Dans chaque explication, il y a toujours référence à une suite de paramètres sous la forme :
-http://www.example.com/index.php?url=/module/action/param1/param2

Dans mon cas et à la base c'est plutôt :
-http://www.example.com/categorie.php?id=identifiant
-http://www.example.com/sous-categorie.php?id=identifiant
-http://www.example.com/page.php?id=identifiant

Est-ce que ta méthode peut s'appliquer à mon cas? Si oui et si tu as le temps, pourrais-tu m'expliquer comment procéder?

Merci
 
WRInaute accro
Ce n'est qu'un exemple simple. Ca peut très bien être comme tu fais:
http://example.com/index.php?url=categorie-id-titre
http://example.com/index.php?url=sous-categorie-id-titre
http://example.com/index.php?url=titre-id

Rewrité avec 1 seule règle pr virer index.php?url=

PHP:
<span class="syntaxhtml"><br /><span class="syntaxdefault"><?php<br /></span><span class="syntaxcomment">//http://example.com/index.php?url=titre-id<br /></span><span class="syntaxdefault">$params </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> explode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'-'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $_GET</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'url'</span><span class="syntaxkeyword">]);<br /><br /></span><span class="syntaxdefault">$id </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> array_pop</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$params</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">$slug </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> implode</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'-'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $params</span><span class="syntaxkeyword">);<br /></span><span class="syntaxcomment">// Etc ...<br /></span><span class="syntaxdefault">?><br /></span></span>

L'astuce principale, c'est de passer tout dans un "front controller". Qui se charge de parser le request (QUERY_STRING, GET, PATH_INFO, REQUEST_URI) et d'inclure tel ou tel module / action / ...
Complément "front controller": http://julien-pauli.developpez.com/tutoriels/php/mvc-controleur/
 
WRInaute passionné
J'ai beaucoup de mal... J'ai suivit ton dernier lien qui consiste en gros à tout séparer (fonction, controller, affichage).

Dans mon fichier "menu.php", j'affiche les liens des articles sous la forme (pour ce teste) :
Code:
<a href="page.php?url='.$lien['id'].'/'.$lien['titre'].'">'.$lien['titre'].'</a>
Ce qui donne par exemple pour le titre "Article 2" : page.php?url=2/Article%202

Dans ma page "page.php" j'ai le code suivant :
Code:
<?php
//----Fonctions----//
//connexion bd
function dbconnect(){
	$connect = mysql_connect("localhost","root","");
	mysql_select_db("teste");
	return $connect;
}
//article
function article($id){
	$article = mysql_query("SELECT id,titre FROM CONTENU WHERE id=$id",dbconnect());
	return mysql_fetch_array($article);
}

//----Controller----//
$params = explode('/', $_GET['url']);
$id_article = article($params[0]);
$titre_article = $params[1];

//----Résultat----//
echo $id_article['id'].'<br/>'.$id_article['titre'];
?>
Si je fais un print_r de $params j’obtiens : Array ( [0] => 2 [1] => Article 2 )

Jusque la, tout fonctionne. La ou je bug, c'est sur le rewrite. Dans mon ".htaccess" j'introduits la règle suivante :
Code:
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ page.php/$1 [L,QSA]

Comme je ne connais pas cette façon de procéder, je ne sais pas exactement ce que c'est censé faire..?
Je ne sais pas non plus si je dois modifier la structure des liens du menu afin d'ajouter une fonction qui permet la ré écriture..?
Bref, je suis largué sur le mode Rewrite :( et un coup de pouce serait vraiment bienvenu.

Note : testes sous Wampserver
 
WRInaute accro
L'exemple que je t'ai montré, c'est avec _GET['url'], c'est page.php?url=.... rewrité.
RewriteRule ^(.+)$ page.php/$1 [L,QSA] ==> ça c'est PATH_INFO.
C'est juste parce qu'il y a différentes façons de faire, tu choisis celle qui te conviens le mieux. Mais tu peux évidemment tester dans un premier temps SANS rewrite.
 
WRInaute passionné
L'exemple que je t'ai montré, c'est avec _GET['url'], c'est page.php?url=.... rewrité.
Je suis désolé mais je ne comprend pas :( Pourquoi dis-tu "...rewrité" à la fin de ta phrase?
L'astuce principale, c'est de passer tout dans un "front controller". Qui se charge de parser le request (QUERY_STRING, GET, PATH_INFO, REQUEST_URI) et d'inclure tel ou tel module / action / ...
Ce n'est pas ce que fait mon précédent code?
Code:
function article($id){
   $article = mysql_query("SELECT id,titre FROM CONTENU WHERE id=$id",dbconnect());
   return mysql_fetch_array($article);
}

//----Controller----//
//http://example.com/page.php?url=id/titre
$params = explode('/', $_GET['url']);
$id_article = article($params[0]);
$titre_article = $params[1];
 
WRInaute accro
l'exemple que t'a donné Spout passe l'url réécrite en paramètre au niveau du htaccess (ça prépare le travail du contrôleur), le tiens se contente de traiter tout ce qu'il ne connais pas (donc qui ne correspond pas a un fichier physique) pour l'envoyer sur le contrôleur (qui se démerde tout seul). Après l'une ou l'autre des solutions doit se valoir en terme de perf.
 
WRInaute accro
Autre exemple à la con:
.htaccess:
PHP:
<span class="syntaxdefault"><br />RewriteEngine&nbsp;on<br />RewriteCond&nbsp;</span><span class="syntaxkeyword">%{</span><span class="syntaxdefault">REQUEST_FILENAME</span><span class="syntaxkeyword">}&nbsp;!-</span><span class="syntaxdefault">f<br />RewriteCond&nbsp;</span><span class="syntaxkeyword">%{</span><span class="syntaxdefault">REQUEST_FILENAME</span><span class="syntaxkeyword">}&nbsp;!-</span><span class="syntaxdefault">d<br />RewriteRule&nbsp;</span><span class="syntaxkeyword">^(.*)$&nbsp;</span><span class="syntaxdefault">index</span><span class="syntaxkeyword">.</span><span class="syntaxdefault">php</span><span class="syntaxkeyword">?/$</span><span class="syntaxdefault">1&nbsp;</span><span class="syntaxkeyword">[</span><span class="syntaxdefault">QSA</span><span class="syntaxkeyword">,</span><span class="syntaxdefault">L</span><span class="syntaxkeyword">]<br />&nbsp;</span><span class="syntaxdefault"></span>

index.php:
PHP:
<span class="syntaxdefault"><br /></span><span class="syntaxkeyword"><?</span><span class="syntaxdefault">php<br />$params&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">ltrim</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$_SERVER</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'QUERY_STRING'</span><span class="syntaxkeyword">],&nbsp;</span><span class="syntaxstring">'/'</span><span class="syntaxkeyword">);<br /><br />if&nbsp;(</span><span class="syntaxdefault">preg_match</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'/(?P<slug>\w+)-(?P<page_id>\d+)/'</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">$params</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">$matches</span><span class="syntaxkeyword">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">//&nbsp;titre-id<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$module&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxstring">'page'</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$slug&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">$matches</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'slug'</span><span class="syntaxkeyword">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$pageId&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">$matches</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'page_id'</span><span class="syntaxkeyword">];<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span class="syntaxstring">"slug:&nbsp;$slug<br&nbsp;/>pageId:&nbsp;$pageId"</span><span class="syntaxkeyword">;<br />}&nbsp;elseif&nbsp;(</span><span class="syntaxdefault">preg_match</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'/categorie-(?P<cat_id>\d+)-(?P<slug>\w+)/'</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">$params</span><span class="syntaxkeyword">,&nbsp;</span><span class="syntaxdefault">$matches</span><span class="syntaxkeyword">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxcomment">//&nbsp;categorie-id-titre<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$module&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxstring">'categorie'</span><span class="syntaxkeyword">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$slug&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">$matches</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'slug'</span><span class="syntaxkeyword">];<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="syntaxdefault">$catId&nbsp;</span><span class="syntaxkeyword">=&nbsp;</span><span class="syntaxdefault">$matches</span><span class="syntaxkeyword">[</span><span class="syntaxstring">'cat_id'</span><span class="syntaxkeyword">];<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span class="syntaxstring">"slug:&nbsp;$slug<br&nbsp;/>catId:&nbsp;$catId"</span><span class="syntaxkeyword">;<br />}<br /><br /></span><span class="syntaxcomment">//&nbsp;include($module.'.php');<br />//&nbsp;...<br />&nbsp;</span><span class="syntaxdefault"></span>
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut