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 : Votez pour cette page avec Wikio

 

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'].'&amp;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('#(\?|&amp;)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&amp;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&amp;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&amp;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&amp;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&amp;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*.

Si vous avez des problèmes pour lire le code, cliquez sur le code pour en générer un autre.
Code de sécurité:
 
Affichage des commentaires 1 à 10 sur 42 | Suivant | Dernier
oxbow151
Posts: 37
Comment
solution erreur 404
Reply #84 on : Fri October 31, 2008, 17:50:10
Bon en cherchant encore plus, j'ai trouvé la solution ! il suffit de rajouté un / devant le nom des fichiers php dans le htaccess. Dans mon cas, le forums se trouve dans Igloops.fr/forums donc j'ai rajouté /forums/ et non / ;) Peut être le rajouter en indication ^^
oxbow151
Posts: 37
Comment
erreur 404
Reply #83 on : Fri October 31, 2008, 16:59:10
Bon j'ai installer ton plugin mais j'ai un beau blem :D C'est que une fois rewrité, ca mène a rien donc erreur 404 :s Cela rewrite bien les liens sur le forum, mais ensuite quand on clique dessus, erreur 404.
Julien
Posts: 37
Comment
Erreur
Reply #82 on : Thu August 28, 2008, 11:25:35
J'obtiens une erreur 404 moi ...
Paul
Posts: 37
Comment
Petite erreur dans le script
Reply #81 on : Tue July 29, 2008, 14:13:57
Bonjour Thorze. J'utilise ton script sur le forum de mon site : http://www.blaguesdegeek.com

J'ai "trouvé" un léger bug et son correctif :

$tpl_main = preg_replace('#(\?|&)p\=1#', NULL, $tpl_main);

remplacé par :

$tpl_main = preg_replace('#(\?|&)p\=1"#', '"', $tpl_main);

Sans cette modif toutes les pages commençant par 1 sont dégagées (de 10 à 19; de 100 à 199; ...) bref assez problématique.

Merci pour le reste du mod.
thorze
Posts: 5
Comment
Re: SimplyPunRW : ou comment utiliser l'url rewriting avec PunBB
Reply #80 on : Mon July 14, 2008, 20:33:29
Je ne sais pas quoi te dire Flow, déjà garde ton calme je suis très pris en ce moment et j'ai très peu de temps pour moi et je ne regarde pas mes mails souvent. De plus j'ai de très nombreuses questions et n'ayant plus le temps d'y répondre elles passent à la corbeille sans quoi je serai très vite submergé. Après pour tes critiques sur le fait que la mod génère de nombreuses erreurs c'est totalement faux ! La seule erreur qui m'a été rapporté est simplement ce problème de bad referrer et cela ne s'applique donc qu'aux modérateurs et administrateurs de ton site et pas à tes simples membres et de plus je le répète chez moi je n'ai pas ce problème et je pense que beaucoup de personnes qui utilisent la mod n'ont pas ce problème non plus.

Tu peux retrouver des informations sur ce problème à cette adresse : http://fluxbb.org/forums/topic/1015/info-bad-httpreferer/ car le problème n'est peut être pas forcément dû à ma modification...

De toute façon la version 3 de punBB ou fluxBB possède l'URL rewriting de base donc la mod va devenir obsolète puisque je pense que la plupart d'entre nous (moi le premier) allons mettre nos forum à jours sur la dernière version lorsqu'une version stable verra le jours et nous ne sommes plus très loin...
Flow
Posts: 37
Comment
Aucune réponse
Reply #79 on : Sun July 13, 2008, 03:35:15
Super, aucune réponse de l'auter ni par mail ni ici, c'est bien dommage, ce petit script avait l'air très sympa.

Je vous déconseille donc de vous en servir, il créé une tonne d'erreurs ! ...
Flow
Posts: 37
Comment
Mauvais HTTP Referrer
Reply #78 on : Mon June 30, 2008, 17:16:29
Moi également, tout comme Britix, lorsque l'url est réécrite impossible d'épingler ou fermer une discussion, il faut obligatoirement passer par /viewtopic.php :( Une solution ?
Britix
Posts: 37
Comment
probleme avec l'épinglement
Reply #77 on : Thu June 26, 2008, 21:41:45
J'ai le même message lorsque je veux épingler un topic...
Britix
Posts: 37
Comment
Problème avec le mod Balise
Reply #76 on : Thu June 26, 2008, 21:40:05
Voila j'ai un soucis dans mon forum, le rewrite fonctionne mais j'ai un probleme quand je veux mettre certaines balise j'obtiens :
"Mauvais HTTP_REFERER. Vous avez été renvoyé sur cette page par une source inconnue ou interdite. Si le problème persiste, assurez-vous que le champ 'URL de base' de la page Admin/Options est correctement renseigné et que vous visitez ces forums en utilisant cette URL. Plus d'informations pourront être trouvées dans la documentation de PunBB."

Merci
Flow
Posts: 37
Comment
Superbe !
Reply #75 on : Mon June 23, 2008, 20:45:39
Merci beaucoup ! Après avoir galéré un certain temps avec le mod de tcheval ... je suis enfin arrivé a un resultat correct grace a votre mod ! =)
Affichage des commentaires 1 à 10 sur 42 | Suivant | Dernier