URL et dotclear2
Par Ludo le samedi 16 février 2008, 14:13 - Divers - Lien permanent
Petit post qui n'a pas grand chose à voir avec l'administration quoiqu'il y a quand même quelques rewrite sous apache. Ces petites modifs ont pour but de mofifier les urls sous dotclear2.
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.
Commentaires
bonjour, merci pource billet intéressant (comme souvent !) ; heureusemen que tu as précisé : depend du nombre de memoires utilisees :)on aurait eu du mal à saisi l'essentiel :)