Url rewriting et les forum simple machines ( smf )

Started by brakstar, August 17, 2005, 09:35:15 AM

Previous topic - Next topic

brakstar

Bonjours à tous les coders.

2 jours que je passe sur le forum smf pour trouver la solution mais, rien ...... j'ai scrutté webrankinfo ...... rien.

Parlons du rewriting et des forums smf. Apremière vue tout est simple , juste une case à cocher et c'est bon. ( encore faut -il que le serveur supporte le mod_rewrite scrutable avec la fonction phpinfo()

Donc moi cela ne marche pas, pourtant je suis presque arrivé au but.

Le code de base de la réécriture d'url dans les forums smf se trouve : forum_smf/source/QueryString.php ( c'est la derniere fonction tout en bas )

elle donne :

// Rewrite URLs to include the session ID.
function ob_sessrewrite($buffer)
{
global $scripturl, $modSettings, $user_info, $context;

// If $scripturl is set to nothing, or the SID is not defined (SSI?) just quit.
if ($scripturl == '' || !defined('SID'))
return $buffer;

// Do nothing if the session is cookied, or they are a crawler - guests are caught by redirectexit().  This doesn't work below PHP 4.3.0, because it makes the output buffer bigger.
if (empty($_COOKIE) && SID != '' && (!$user_info['is_guest'] || (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== false)) && @version_compare(PHP_VERSION, '4.3.0') != -1)
$buffer = preg_replace('/"' . preg_quote($scripturl, '/') . '(?!\?' . preg_quote(SID, '/') . ')(\?)?/', '"' . $scripturl . '?' . SID . ';', $buffer);

// This should work even in 4.2.x, just not CGI.
if (!empty($modSettings['queryless_urls']) && (!$context['server']['is_cgi'] || @ini_get('cgi.fix_pathinfo') == 1) && $context['server']['is_apache'])
{
// Let's do something special for session ids!
if (defined('SID') && SID != '')
$buffer = preg_replace('/"' . preg_quote($scripturl, '/') . '\?(?:' . SID . ';)((?:board|topic)=[^#"]+?)(#[^"]*?)?"/e', "'\"' . \$scripturl . '/' . strtr('\$1', '&;=', '//,') . '.html?' . SID . '\$2\"'", $buffer);
else
$buffer = preg_replace('/"' . preg_quote($scripturl, '/') . '\?((?:board|topic)=[^#"]+?)(#[^"]*?)?"/e', "'\"' . \$scripturl . '/' . strtr('\$1', '&;=', '//,') . '.html\$2\"'", $buffer);
}

// Return the changed buffer.
return $buffer;
}


Chez moi elle ne marche pas .......

Les urls sont toujours sous forme de :

http://www.brakstar.com/forum/index.php?board=19.0 [nofollow]

alors que je voudrai qu'elle soit sous la forme ( pour l'instant ) :

http://www.brakstar.com/forum/index.php/topic,1628.html [nofollow]

Après avoir lu un tutorial de Mr [Unknow]

J'ai remplacé la fonction ci dessus par :

// Rewrite URLs to include the session ID.
function ob_sessrewrite($buffer)
{
global $scripturl, $modSettings, $user_info, $context;

// If $scripturl is set to nothing, or the SID is not defined (SSI?) just quit.
if ($scripturl == '' || !defined('SID'))
return $buffer;

// Do nothing if the session is cookied, or they are a crawler - guests are caught by redirectexit().  This doesn't work below PHP 4.3.0, because it makes the output buffer bigger.
if (empty($_COOKIE) && SID != '' && (!$user_info['is_guest'] || (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== false)))
$buffer = preg_replace('/"' . preg_quote($scripturl, '/') . '(?!\?' . preg_quote(SID, '/') . ')(\?)?/', '"' . $scripturl . '?' . SID . '&', $buffer);
// You can't do both, because session_start() won't catch the session if you do.  But this should work even in 4.2.x, just not CGI.
else
$buffer = preg_replace('/"' . preg_quote($scripturl, '/') . '\?((?:board|topic)=[^#"]+)(#[^"]*)?"/e', "'\"' . \$scripturl . '/' . strtr('\$1', '&;=', '//,') . '.html\$2\"'", $buffer);

// Return the changed buffer.
return $buffer;
}


Et la ça à presque marché !

J'avais des pages sous forme :

http://www.brakstar.com/forum/index.php/topic,1628.html [nofollow]

mais malheureusement sur tousles urls rewrités il y avait une erreur 404 ( page inconnue au bataillon.

J'ai aussi mis un .htacces dans forum/

avec ce code :

RewriteEngine On
RewriteRule ^topic-([^/]+)[/]?$ /forum/index.php?topic=$1
RewriteRule ^board-([^/]+)[/]?$ /forum/index.php?board=$1


Mais rien ne fais ...  erreur 404   :'(

version du forum : 1.1 beta 3 public

:?:  Pourriez vous m'aider  :?:
webmaster

brakstar

Voici le tutorial pour VRAIMENT réécrire les urls D'un forum SMF 1.1 Béta 3 Publique !

avoir de urls sous forme :

http://www.serveur.com/forum/board-11.0 [nofollow]

( niveau du tutos : moyen quand vous avez la solution ! et vous l'avez ! )

Donc suposons que vous avez un forum smf ayant cette url :

http://www.serveur.com/forum/ [nofollow]

Premiere chose :

Remplacer la derniere fonction de http://www.serveur.com/forum/source/QueryString.php [nofollow] qui se présente sous forme :

// Rewrite URLs to include the session ID.
function ob_sessrewrite($buffer)
{
global $scripturl, $modSettings, $user_info, $context;

// If $scripturl is set to nothing, or the SID is not defined (SSI?) just quit.
if ($scripturl == '' || !defined('SID'))
return $buffer;

// Do nothing if the session is cookied, or they are a crawler - guests are caught by redirectexit().  This doesn't work below PHP 4.3.0, because it makes the output buffer bigger.
if (empty($_COOKIE) && SID != '' && (!$user_info['is_guest'] || (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== false)) && @version_compare(PHP_VERSION, '4.3.0') != -1)
$buffer = preg_replace('/"' . preg_quote($scripturl, '/') . '(?!\?' . preg_quote(SID, '/') . ')(\?)?/', '"' . $scripturl . '?' . SID . ';', $buffer);

// This should work even in 4.2.x, just not CGI.
if (!empty($modSettings['queryless_urls']) && (!$context['server']['is_cgi'] || @ini_get('cgi.fix_pathinfo') == 1) && $context['server']['is_apache'])
{
// Let's do something special for session ids!
if (defined('SID') && SID != '')
$buffer = preg_replace('/"' . preg_quote($scripturl, '/') . '\?(?:' . SID . ';)((?:board|topic)=[^#"]+?)(#[^"]*?)?"/e', "'\"' . \$scripturl . '/' . strtr('\$1', '&;=', '//,') . '.html?' . SID . '\$2\"'", $buffer);
else
$buffer = preg_replace('/"' . preg_quote($scripturl, '/') . '\?((?:board|topic)=[^#"]+?)(#[^"]*?)?"/e', "'\"' . \$scripturl . '/' . strtr('\$1', '&;=', '//,') . '.html\$2\"'", $buffer);
}

// Return the changed buffer.
return $buffer;
}


par :

// Rewrite URLs to include the session ID.
function ob_sessrewrite($buffer)
{
global $scripturl, $modSettings, $user_info, $context;

// If $scripturl is set to nothing, or the SID is not defined (SSI?) just quit.
if ($scripturl == '' || !defined('SID'))
return $buffer;

// Do nothing if the session is cookied, or they are a crawler - guests are caught by redirectexit().  This doesn't work below PHP 4.3.0, because it makes the output buffer bigger.
if (empty($_COOKIE) && SID != '' && (!$user_info['is_guest'] || (strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla') !== false || strpos($_SERVER['HTTP_USER_AGENT'], 'Opera') !== false)))
$buffer = preg_replace('/"' . preg_quote($scripturl, '/') . '(?!\?' . preg_quote(SID, '/') . ')(\?)?/', '"' . $scripturl . '?' . SID . '&', $buffer);
// You can't do both, because session_start() won't catch the session if you do.  But this should work even in 4.2.x, just not CGI.
else
$buffer = preg_replace('/"' . preg_quote($scripturl, '/') . '\?((?:board|topic)=[^#"]+)(#[^"]*)?"/e', "'\"' . \$scripturl . '/' . strtr('\$1', '&;=', '//,') . '.html\$2\"'", $buffer);

// Return the changed buffer.
return $buffer;


ensuite ajouter cette ligne à http://www.serveur.com/forum/index.php [nofollow] :

$scripturl2 = '/';

juste après :

// Get everything started up...
define('SMF', 1);
@set_magic_quotes_runtime(0);
error_reporting(E_ALL);
$time_start = microtime();


Ligne 37 environ

ensuite :

Editez ces 3 fichiers :

Sources/BoardIndex.php
Sources/Display.php
Sources/MessageIndex.php


Remplacer les expressions contenant :

'<a href="' . $scripturl . '?topic=' .

par :

'<a href="' . $scripturl . '/forum/topic-' .

puis toujours dans ces fichiers

'<a href="' . $scripturl . '?board=' .

par :

'<a href="' . $scripturl . '/forum/board-' .

Ensuite rechercher dans vos fichiers ****.template.php et vos 3 fichiers sources précédement modifiés les codes contenant :

?board=

remplacer les par :

/forum/board-

idem pour les codes contenant :

?topic=

changer par :

/forum/topic-

ensuite il faudra déclarer la variable globale dans vos fichiers ****.template.php comme ceci

global $scripturl2,

déclarer partout ou cela est néccéssaire.

déclaré la aussi dans display.php ces lignes sont en générale en haut de page mais méfiez vous.

puis configurez votre .htaccess placé dans votre repertoir : /forum/ de cette façon ( ceci peut varier selon les différents serveurs moi c'est papache  ) :

RewriteEngine On
RewriteRule ^topic-([^/]+)[/]?$ /forum/index.php?topic=$1 [L]
RewriteRule ^board-([^/]+)[/]?$ /forum/index.php?board=$1 [L]


et voila mes amis vos urls seront sous forme de :

http://www.serveur.com/forum/board-11.0 [nofollow]

et vos topics :

http://www.serveur.com/forum/topic-72.0 [nofollow]

a+ les amigos

webmaster

MondeGsm

Je crois que cette petite merveille ont devrait le mettre en sujet épinglé car pour le référencement c'est l'idéale, ce soir je m'y met :)

Him

Bonjour,

Pensez vous que je puisse éffectuer cette modification sur une RC2 ?

Merci

h4ni


tlnlt

salut, je viens de télécharger le smf 1.7 et je voudrais faire de lurl rewriting comme dans PHPBB avec les titres et tout, comment faire?
j'ai vu le site hxxp:www.guitarpart.fr/forum/ [nonactive] qui le fait très bien, comment ils font? svp?


Zonequad


brakstar

Oui je suis passé manuellement de 1.1 b 3 vers RC2 et le rewriting fonctionne éxactement pareil.

No problemo tout est ok
webmaster

h4ni


Zonequad

tu as de la chance moi impossible d avoir des .html je suis vraiment nul je doit louper qq chose  :'(

Him

Salut Blakstar

Quand tu parles de définir la variable global, tu parles de remplacer la ligne :

   global $context, $settings, $options, $txt, $scripturl, $modSettings;


par global $scripturl2,

c'est bien cela ?

Him

en dehors, de cela, j'ai tout mis & l'url rewriting se fait bien...


sauf que

http://www.********************.be/forum/index.php/forum/board-1.0

il me duplique le /forum/ je suppose donc que je dois supprimer le /forum/ que tu m'as fait rajouter partout.

La je suis retourné à la configuration d'origines pour permettre à mon forum de continuer à tourner.

Des que j'aurai ta réponse pour la variable je réattaque.

Zonequad

je suis rassurer j ai exactement le meme probleme que toi  :'(

MkC

#13
Bon j'ai fait un tuto sur le sujet si y'en a que ça interesse.
Alors je precise que tout le forum n'est pas indéxé en url rexriting, seulement les boards-topics pour le moment, les messages viendront un peu plus tard.
J'ai fait simple en gardant dans l'esprit de ne pas mettre le bronx dans la structure smf, donc je touche un minimum de fichier et c'est 100% compatible avec tout les themes normalement.

Bonne utilisation


dough29

#14
Hello !

L'un des arguments dand l'utilisation de l'URL Rewriting est le référencement.

La question que je me pose est celle-ci:

Est-il vraiment utile de rendre SMF 100% URL Rewrited.

Je m'explique: le but est que dans les moteurs de recherche, l'URL soit plus lisible. Donc pour moi, seules les URL des "Boards" et des "Topics" ont à être passée en URL Rewriting.

Donc pas la peine de farfouiller tous les liens mais seulement ceux qui en ont vraiment besoin.

J'aimerai avoir vos avis sur cette position ;D

Bon codage à tous :D

MkC

Je pense comme toi, c'est pourquoi je me suis contenté de ne faire que les boards et les liens des messages ce qui suffit amplement à mon sens pour de l'url rewriting.

Advertisement: