SimplyPunRW : ou comment utiliser l'url rewriting avec PunBB
Date : 17/12/07 12:37:12
Si vous appréciez cet article cliquez sur ce bouton : 
Cela fait plusieurs jours que je me creuse la tête pour remplacer l'ancienne modification NewPunRewrite de punBB que j'avais proposée sur Tcheval.net il y à quelques temps de ça. Que le temps passe vite d'ailleurs !
C'est en surfant sur le site de PunBB-fr que j'ai finalement eu l'idée de cette mod. Je suis parti de ce qu'à proposé Ju sur cette discussion sur une façon d'éviter la duplication des URL. D'ailleurs il en à fait une mod que je conseil à tous de télécharger ici sauf si vous voulez utiliser SimplyPunRW car j'ai intégré sa mod à la mienne...
Trêve de blabla je vous présente ma modification que j'ai appelé SimplyPunRW :
- Rewrite des urls vers les forums + ajout du titre du forum dans l'url
viewforum.php?id=1 deviens f1-forum-test.html
Si il y à plusieurs page :
viewforum.php?id=1&p=2 deviens f1-page2-forum-test.html
- Rewrite des urls vers les sujets + ajout du titre du sujet dans l'url
viewtopic.php?id=1 deviens s1-message-test.html
- Rewrite des recherches
- Rewrite des liens vers le profil
- Rewrite de la pagination
- Rewrite de la navbar
- Prise en charge de la pagination
- Aucun problème de Bad referrer (Il y en à avec NewPunRewrite)
Mais le principal intérêt de cette modification est sa facilité à mettre en place. Et dire facilité n'est pas un euphémisme. Loin de là !
1 seul fichier à modifier et 1 fichier htaccess à ajouter !
Vous trouverez difficilement plus simple à mettre en place surtout pour une prise en charge complète de l'url rewriting. Voici la modification à faire (N'oubliez pas de créer également un fichier .htacess (disponible plus bas) :
# #---------[ 1. OUVRIR ]------------------------------------------------------- # footer.php # #---------[ 2. TROUVER ]----------------------------------------------------- # // Close the db connection (and free up any result data) $db->close(); # #---------[ 3. AJOUTER AVANT ]----------------------------------------- # // SimplyPunRW par Thorze // On commence par récupérer les pid de tous les liens qui appellent un message précis $pattern = 'viewtopic.php?pid=<PID>'; // URL Rewriting ? preg_match_all('#'.str_replace('\<PID\>', '([0-9]+)', preg_quote($pattern, '#')).'#', $tpl_main, $pids); $pids = array_unique($pids[1]); if(!empty($pids)) { // On récupére ensuite les id des topics qui correspondent aux différents pid $result = $db->query('SELECT id, topic_id FROM '.$db->prefix.'posts WHERE id='.implode(' OR id=', $pids)) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error()); if (!$db->num_rows($result)) message($lang_common['Bad request']); while ($pid_id = $db->fetch_assoc($result)) { $adresse[$pid_id['id']] = Array('topic_id' => $pid_id['topic_id']); if (isset($query)) $query .= ' OR topic_id='.$pid_id['topic_id']; else $query = $pid_id['topic_id']; } // On récupére et on classe ensuite les pid de tous les posts de tous les topics concernés $result = $db->query('SELECT topic_id, id FROM '.$db->prefix.'posts WHERE topic_id='.$query.' ORDER BY posted') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error()); while ($id_pid = $db->fetch_assoc($result)) $posts[$id_pid['topic_id']][] = $id_pid['id']; // On recherche les pid des liens dans les pid des topics et on récupére la place qu'ils occupent pour calculer leur page foreach ($posts AS $id => $pids) { foreach(array_keys($adresse) AS $pid) { if(($position = array_search($pid, $pids)) !== false) $adresse[$pid]['p'] = ceil(($position + 1) / $pun_user['disp_posts']); } } // On remplace enfin les adresses avec les pid par des adresses uniques et directes avec l'id du topic en précisant la page foreach($adresse AS $pid => $url) $tpl_main = str_replace(str_replace('<PID>', $pid, $pattern), 'viewtopic.php?id='.$url['topic_id'].'&p='.$url['p'].'', $tpl_main); } // On en profite pour virer tous les ?p=1 ou &p=1 qui doublonnent aussi inutilement les pages $tpl_main = preg_replace('#(\?|&)p\=1#', NULL, $tpl_main); // Fonction de rewrite function pun_url($str,$more=false) { if((!isset($more)) || ($more == false)){ $max = 2; }else{ $max = $more; } $str = strtr($str,"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÌÍÎÏìíîïÙÚÛÜùúûüÿÑñÇç'`", "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeIIIIiiiiUUUUuuuuyNnCc "); $str = strtolower($str); $str = preg_replace('/[^a-z0-9_\.\s]/',' ',$str); $str = preg_replace('/[^a-z0-9_\s]\./','',trim($str)); $str = str_replace('.',' ',$str); $str = str_replace('_',' ',$str); $str = " ".$str." "; $str = ereg_replace(' .{1,'.$max.'} ', ' ', $str); $str = ereg_replace(' .{1,'.$max.'} ', ' ', $str); $rep = array(" quel ", " crois ", " etes ", " quand ", " suis ", " aux "," moi ", " sont ", " quelle ", " quoi ", " mon ", " est ", " plus ", " que ", " vous ", " faites ", " par "," dans "," pour "," pas "," les "," des "," que "," une "," avec "," qui "," sur "," mes "); $str = str_replace($rep," ",$str); $str = trim($str); $str = preg_replace('/[\s]+/','-',$str); if(count(explode("-", $str)) >= 8){ $max++; $str = pun_url(str_replace('-',' ',$str),$max); } if(!$more){ if((!isset($str)) || ($str == "")){ $str = "punseo"; } } return $str; } // Rewrite de la navbar $tpl_main = preg_replace('#<a href="index.php#', '<a href="index.html', $tpl_main); $tpl_main = preg_replace('#<a href="userlist.php#', '<a href="utilisateurs.html', $tpl_main); $tpl_main = preg_replace('#<a href="search.php#', '<a href="recherche.html', $tpl_main); $tpl_main = preg_replace('#<a href="register.php#', '<a href="inscription.html', $tpl_main); $tpl_main = preg_replace('#<a href="login.php#', '<a href="connexion.html', $tpl_main); $tpl_main = preg_replace('#<a href="connexion.html\?action=forget#', '<a href="oublie-mot-de-passe.html', $tpl_main); // Rewrite de viewforum et on ajoute le nom du forum dans l'url $pattern = 'viewforum.php?id=<ID>'; preg_match_all('#'.str_replace('\<ID\>', '([0-9]+)', preg_quote($pattern, '#')).'#', $tpl_main, $out); $out2 = array_unique($out[1]); if(!empty($out2)) { $tabunique2=array_values($out2); $i=0; while ($i<count($tabunique2)) { $id7 = $tabunique2[$i]; $result = $db->query('SELECT id, forum_name FROM '.$db->prefix.'forums WHERE id='.$id7) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error()); while ($fnom = $db->fetch_assoc($result)) { $tpl_main = preg_replace('#<a href="viewforum.php\?id='.$fnom['id'].'#', '<a href="f'.$id7.'-'.pun_url($fnom['forum_name']).'.html', $tpl_main); $tpl_main = preg_replace('#<a href="f([0-9]+)-'.pun_url($fnom['forum_name']).'.html([0-9]+)#', '<a href="f\\1\\2.html', $tpl_main); $tpl_main = preg_replace('#<a href="f'.$id7.'-'.pun_url($fnom['forum_name']).'.html&p=([0-9]+)#', '<a href="f'.$fnom['id'].'-page\\1-'.pun_url($fnom['forum_name']).'.html', $tpl_main); } $i++; } } // Rewrite de viewtopic et on ajoute le titre du post dans l'url $pattern = 'viewtopic.php?id=<ID>'; preg_match_all('#'.str_replace('\<ID\>', '([0-9]+)', preg_quote($pattern, '#')).'#', $tpl_main, $out); $out3 = array_unique($out[1]); if(!empty($out3)) { $tabunique3=array_values($out3); $i=0; while ($i<count($tabunique3)) { $id7 = $tabunique3[$i]; $result = $db->query('SELECT id, subject FROM '.$db->prefix.'topics WHERE id='.$id7.'') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error()); while ($fnom = $db->fetch_assoc($result)) { $tpl_main = preg_replace('#<a href="viewtopic.php\?id='.$fnom['id'].'#', '<a href="s'.$fnom['id'].'-'.pun_url($fnom['subject']).'.html', $tpl_main); $tpl_main = preg_replace('#<a href="s([0-9]+)-'.pun_url($fnom['subject']).'.html([0-9]+)#', '<a href="s\\1\\2.html', $tpl_main); $tpl_main = preg_replace('#<a href="s'.$fnom['id'].'-'.pun_url($fnom['subject']).'.html&p=([0-9]+)#', '<a href="s'.$fnom['id'].'-page\\1-'.pun_url($fnom['subject']).'.html', $tpl_main); $tpl_main = preg_replace('#<a href="s'.$fnom['id'].'-'.pun_url($fnom['subject']).'.html&action=new#', '<a href="s'.$fnom['id'].'-nouveaux-messages.html', $tpl_main); } $i++; } } // Rewrite du profil $tpl_main = preg_replace('#<a href="profile.php\?id=([0-9]+)#', '<a href="profil-\\1.html', $tpl_main); // Rewrite des liens de recherche $tpl_main = preg_replace('#<a href="recherche.html\?action=show_24h#', '<a href="recherche-24-heures.html', $tpl_main); $tpl_main = preg_replace('#<a href="recherche.html\?action=show_unanswered#', '<a href="recherche-sans-reponse.html', $tpl_main); $tpl_main = preg_replace('#<a href="recherche.html\?action=show_subscriptions#', '<a href="mes-marque-pages.html', $tpl_main); $tpl_main = preg_replace('#<a href="recherche.html\?action=show_new#', '<a href="nouveaux-messages.html', $tpl_main); $tpl_main = preg_replace('#<a href="recherche.html\?action=show_user&user_id=([0-9]+)#', '<a href="voir-messages-de-\\1.html', $tpl_main); $tpl_main = preg_replace('#<a href="recherche.html\?search_id=([0-9]+)#', '<a href="recherche\\1.html', $tpl_main); $tpl_main = preg_replace('#<a href="recherche([0-9]+).html&p=([0-9]+)#', '<a href="recherche\\1-page\\2.html', $tpl_main); //Divers misc.php $tpl_main = preg_replace('#<a href="misc.php\?action=rules#', '<a href="regles.html', $tpl_main); $tpl_main = preg_replace('#<a href="misc.php\?action=markread#', '<a href="marquer-discussions-comme-lues.html', $tpl_main); # #---------[ 4. ENREGISTRER/ENVOYER SUR LE SERVEUR ]---------------------------- #
Il ne vous reste plus qu'à créer un fichier .htaccess avec ceci dedans :
RewriteEngine on RewriteRule ^index.html$ index.php [L] RewriteRule ^f([0-9]+)-page([0-9]+)-(.*).html$ viewforum.php?id=$1&p=$2 [L] RewriteRule ^f([0-9]+)(.*)$ viewforum.php?id=$1 [L] RewriteRule ^s([0-9]+)-page([0-9]+)-(.*).html$ viewtopic.php?id=$1&p=$2 [L] RewriteRule ^s([0-9]+)-nouveaux-messages.html$ viewtopic.php?id=$1&action=new [L] RewriteRule ^s([0-9]+)(.*)$ viewtopic.php?id=$1 [L] RewriteRule ^profil-([0-9]+)(.*)$ profile.php?id=$1 [L] RewriteRule ^inscription.html$ register.php [L] RewriteRule ^connexion.html$ login.php [L] RewriteRule ^oublie-mot-de-passe.html$ login.php?action=forget [L] RewriteRule ^recherche.html$ search.php [L] RewriteRule ^recherche([0-9]+).html$ search.php?search_id=$1 [L] RewriteRule ^recherche([0-9]+)-page([0-9]+).html$ search.php?search_id=$1&p=$2 [L] RewriteRule ^utilisateurs.html$ userlist.php [L] RewriteRule ^recherche-24-heures.html$ search.php?action=show_24h [L] RewriteRule ^([0-9]+)-mes-messages.html$ search.php?action=show_user&user_id=$1 [L] RewriteRule ^mes-marque-pages.html$ search.php?action=show_subscriptions [L] RewriteRule ^recherche-sans-reponse.html$ search.php?action=show_unanswered [L] RewriteRule ^nouveaux-messages.html$ search.php?action=show_new [L] RewriteRule ^voir-messages-de-([0-9]+).html$ search.php?action=show_user&user_id=$1 [L] RewriteRule ^utilisateurs-pseudo(.*)-groupe(.*)-sort(.*)-ordre(.*)-([0-9]+)(.*)$ userlist.php?username=$1&show_group=$2&sort_by=$3&sort_dir=$4&p=$5 [L] RewriteRule ^regles.html$ misc.php?action=rules [L] RewriteRule ^marquer-discussions-comme-lues.html$ misc.php?action=markread [L]
Puis d'uploader ce fichier .htaccess à la racine de votre forum punBB.
Si vous voulez tester la mod, je m'en sers à cette adresse Le forum Zbomique et je vais surement l'appliquer sur tout mes forums qui tournent sous punBB !
Ecrire un commentaire
- Les champs indispensables sont marqué avec le caractère*.
Posts: 37
Reply #83 on : Fri October 31, 2008, 16:59:10
Posts: 37
Reply #82 on : Thu August 28, 2008, 11:25:35
Posts: 37
Reply #81 on : Tue July 29, 2008, 14:13:57
Posts: 37
Reply #79 on : Sun July 13, 2008, 03:35:15
Posts: 37
Reply #78 on : Mon June 30, 2008, 17:16:29
Posts: 37
Reply #77 on : Thu June 26, 2008, 21:41:45
Posts: 37
Reply #76 on : Thu June 26, 2008, 21:40:05
Posts: 37
Reply #75 on : Mon June 23, 2008, 20:45:39
Posts: 37
Reply #84 on : Fri October 31, 2008, 17:50:10