1.Côté dotclear

Nous avons des urls du style :

http://www.moustik.org/index.php/

Nous voulons supprimer cet inutile (niveau esthétique) /index.php/

Première chose à faire, modifier dans l'interface d'administration l'URL de base, par ex. :

http://www.moustik.org

Et aussi passer la "Méthode de lecture d'URL" à PATH_INFO

Et là le site par en branle... normal. Dotclear s'attend à des urls de type :

2.Côté rewrite : supprimer /index.php/

http://www.moustik.org/index.php/...

Et nous on lui envoie du :

http://www.moustik.org/...

Pour rectifier l'url, on va devoir la réécrire afin de la rendre cohérente pour dotclear. Donc on va transformer :

http://www.moustik.org/... -> http://www.moustik.org/index.php/...

La rewrite correspondante est celle là :

RewriteRule (.*)$ /index.php/$1

Quelques explications sur cette ligne :

  • .* : chaine de caractères composé de 0 à n caractères.
  • $ : fin de ligne
  • () : ouvre un espace mémoire pour stocker ce qu'on lui envoit, on pourra récupérer cette mémoire via la variable $1, $2, $3, etc. (dépend du nombre de mémoires utilisées).

Donc déjà une URL sera transformée comme ceci :

http://www.moustik.org/toto.html -> http://www.moustik.org/index.php/toto.html

Il y a des effets de bord, les css ne fonctionnent plus car :

http://www.moustik.org/toto.css -> http://www.moustik.org/index.php/toto.css

Il faut empecher l'écriture d'url sur les css, donc on va interdire le réécriture sur les url se terminant pas css, la règle devient :

RewriteCond %{REQUEST_URI} !^(.*).css$
RewriteRule (.*)$ /index.php/$1

Idem pour l'interface d'admin, ce qui donne :

RewriteCond %{REQUEST_URI} !^(.*).css$
RewriteCond %{REQUEST_URI} !^/admin/(.*)$
RewriteRule (.*)$

3.Côté rewrite : supprimer /post/

Dans la continuité, on peut également supprimer de l'url /post/ qui compose l'adresse des articles, en gros on veut passer de :

http://www.moustik.org/post/2008/02/16/Screen -> http://www.moustik.org/2008/02/16/Screen

Modifier le fichier : inc/prepend.php Remplacer :

$core->url->register('post','post','^post/(.+)$',array('dcUrlHandlers','post'));

par :

$core->url->register('post','','^post/(.+)$',array('dcUrlHandlers','post'));

Et on créé la rewrite correspondante :

RewriteCond %{REQUEST_URI} ^/([0-9]{4})/(.*)$
RewriteRule (.*)$ /index.php/post/$1 [L]

La condition de cette rewrite est que si l'URI commence par un nombre de quatre chiffres (0000 à 9999), on la réécrit en lui ajoutant /index.php/post/ afin que dotclear s'y retrouve. La directive [L] (last) permet de spécifier que si l'URI 'matche' avec la règle, on s'arrète là, aucune autre règle ne sera lu.

4.Côté dotclear : inc/prepend.php

Au niveau de dotclear, on doit modifier les urls car il manque des / devant les URI, donc on les rajoute dans dotclear dans le fichier prepend où les urls sont composées :

$ vi inc/prepend.php

Remplacer :

$core->url->registerDefault(array('dcUrlHandlers','home'));
$core->url->register('lang','','^([a-zA-Z]{2}(?:-[a-z]{2})?(?:/page/[0-9]+)?)$',array('dcUrlHandlers','lang'));
$core->url->register('post','post','^post/(.+)$',array('dcUrlHandlers','post'));
$core->url->register('category','category','^category/(.+)$',array('dcUrlHandlers','category'));
$core->url->register('archive','archive','^archive(/.+)?$',array('dcUrlHandlers','archive'));
$core->url->register('feed','feed','^feed/(.+)$',array('dcUrlHandlers','feed'));
$core->url->register('trackback','trackback','^trackback/(.+)$',array('dcUrlHandlers','trackback'));
$core->url->register('rsd','rsd','^rsd$',array('dcUrlHandlers','rsd'));
$core->url->register('xmlrpc','xmlrpc','^xmlrpc/(.+)$',array('dcUrlHandlers','xmlrpc'));

par :

$core->url->registerDefault(array('dcUrlHandlers','home'));
$core->url->register('lang','','^([a-zA-Z]{2}(?:-[a-z]{2})?(?:/page/[0-9]+)?)$',array('dcUrlHandlers','lang'));
$core->url->register('post','','^post/(.+)$',array('dcUrlHandlers','post'));
$core->url->register('category','/category','^category/(.+)$',array('dcUrlHandlers','category'));
$core->url->register('archive','/archive','^archive(/.+)?$',array('dcUrlHandlers','archive'));
$core->url->register('feed','/feed','^feed/(.+)$',array('dcUrlHandlers','feed'));
$core->url->register('trackback','/trackback','^trackback/(.+)$',array('dcUrlHandlers','trackback'));
$core->url->register('rsd','/rsd','^rsd$',array('dcUrlHandlers','rsd'));
$core->url->register('xmlrpc','/xmlrpc','^xmlrpc/(.+)$',array('dcUrlHandlers','xmlrpc'));

5.Côté dotclear : plugins/metadata/_prepend.php

Nous avons le même problème pour les tags

vi plugins/metadata/_prepend.php

Remplacer :

$GLOBALS['core']->url->register('tag','tag','^tag/(.+)$',array('urlMetadata','tag'));
$GLOBALS['core']->url->register('tags','tags','^tags$',array('urlMetadata','tags'));
$GLOBALS['core']->url->register('tag_feed','feed/tag','^feed/tag/(.+)$',array('urlMetadata','tagFeed'));

Par :

$GLOBALS['core']->url->register('tag','/tag','^tag/(.+)$',array('urlMetadata','tag'));
$GLOBALS['core']->url->register('tags','/tags','^tags$',array('urlMetadata','tags'));
$GLOBALS['core']->url->register('tag_feed','/feed/tag','^feed/tag/(.+)$',array('urlMetadata','tagFeed'));

Pour finir, les règles de réécriture ressemblent à cela

  • Pas de rewrite appliquées sur les URI se terminant par css
  • Pas de rewrite appliquées sur les URI commencant par /admin/
  • Pour les URI commencant par un nombre de 0000 à 9999, on prefixe l'URI avec /index.php/post/
  • Pour les URI commencant par /category, /archive, /feed, /tag, /tags, /feed, /trackback, /rsd, /xmlrpc, on préfixe l'URI avec /index.php/
RewriteEngine On

RewriteCond %{REQUEST_URI} !^(.*).css$
RewriteCond %{REQUEST_URI} !^/admin/(.*)$
RewriteCond %{REQUEST_URI} ^/([0-9]{4})/(.*)$
RewriteRule (.*)$ /index.php/post/$1 [L]

RewriteCond %{REQUEST_URI} ^/(page|category|archive|feed|tag|tags|feed|trackback|rsd|xmlrpc)(.*)$
RewriteRule (.*)$ /index.php/$1

Voilà ca devrait couvrir les besoins de dotclear.