Ayant eu pas mal de difficultés à parvenir à mes fins, j'espère que ce billet évitera ces complications à d'autres :)
Le contexte
Mon installation de dotclear commence à dater, installation faite en utilisant le format QUERY STRING, le tout dans un sous-répertoire dotclear, ce qui produisait jusque là des URL au format :
http://www.breizh-ardente.fr/dotclear/index.php?2008/03/27/99-changement-de-format-des-url-et-redirection-htaccess-avec-dotclear-1qui sont maintenant de cette forme :
http://www.breizh-ardente.fr/dotclear/99-changement-de-format-des-url-et-redirection-htaccess-avec-dotclear-1
Passage du mode QUERY STRING au mode PATH INFO
Je viens sans difficulté de basculer le tout au format PATH INFO et de simplifier leur apparence (suppression de la date) au moyen du plugin personnalisation d'URLs, en rajoutant une petite astuce de réécriture d'URL pour supprimer aussi le index.php de l'URL.
Mon .htaccess de départ est le suivant :
Redirect temp /index.html http://www.breizh-ardente.fr/dotclear/ ErrorDocument 404 /dotclear/erreur404 AddType application/x-httpd-php5 .php RedirectPermanent /dotclear/punbb http://forum.breizh-ardente.fr # RSS Dotclear 1 RewriteEngine on RewriteBase / RewriteCond %{HTTP_USER_AGENT} !FeedBurner RewriteRule dotclear/rss.php$ http://feeds.feedburner.com/Breizh-ardente [L,R=301]
Commencez par basculer les URLs au format PATH INFO. Connectez vous à votre interface d'administration, onglet «outils», rubrique «configuration de dotclear», champ «Type des URL».
Installez le plugin et choisissez le format qui vous convient
Supprimer index.php de l'URL
Ensuite, toujours dans la «configuration de dotclear», champ «URL vers le weblogue», enlevez index.php de l'adresse du blog
Chez moi, /dotclear/index.php devient /dotclear/
Reste à activer le mod rewrite dans le fichier .htaccess, ce qui passe par les instructions :
RewriteEngine on RewriteBase /à rajouter au début du fichier si elles ne sont pas encore présentes, puis rajouter à la fin :
# URL simplifiees RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /dotclear/index.php
En l'état, les nouvelles URLs sont fonctionnelles.
Reconnaitre les anciennes URLs dans les liens externes
La partie qui m'a fait suer : faire en sorte que les liens externes pointant vers des articles existants soient redirigés vers la nouvelle adresse.
La solution passe encore par de la réécriture d'URL, un peu plus avancée cette fois.
Première difficulté : les URL entrantes sont au format QUERY STRING qui n'est plus pris en charge par le blog
Ensuite, une chaine significative de l'URL n'existe tout simplement plus...
Je ne vais pas refaire un tutoriel sur la réécriture d'URL, c'est pas dans mes cordes, je vais juste vous indiquer quelques liens qui m'ont permis de parvenir à mes fins :
- http://www.webmaster-hub.com/publication/Mod-rewrite-ou-la-reecriture-des.html
- http://www.webrankinfo.com/analyses/autres/url-rewriting-debutants.php
- http://web.developpez.com/tutoriel/apache/urlrewriting/
Ce qui conduit à établir les règles suivantes :
# anciennes URL RewriteCond %{QUERY_STRING} ^([0-9]{4})/([0-9]{2})/([0-9]{2})/([0-9]{2,3})-([a-zA-Z0-9-]+)$ RewriteRule ^dotclear/index.php /dotclear/%4-%5? [L,R=301] # anciennes categories RewriteCond %{QUERY_STRING} ^([A-Z][a-zA-Z0-9-]+)$ RewriteRule ^dotclear/index.php /dotclear/%1? [L,R=301]À placer dans le fichier .htaccess AVANT la partie #URL simplifiees
En résumé :
Le changement de format d'URLs oblige à passer par la condition RewriteCond %{QUERY_STRING} au lieu d'une simple règle RewriteRule
Le détail important : le caractère ? à la fin de l'URL réécrite, toujours à cause de l'ancien format QUERY STRING
Indispensable : les options [L,R] en fin de règle pour éviter une erreur 500