J’ai été amené récemment à protéger l’accès d’un blog Dotclear 2 à l’aide du plugin Private Mode développé par Osku. Ce plugin, une fois paramétré, protège tous les accès aux différentes parties du blog par un mot de passe sauf l’accès aux flux RSS générés. Pour ces derniers, une nouvelle URL fabriquée à partir du mot de passe est générée, ce qui rend inutilisable les URL standards de type http://www.domaine.tld/feed/rss2
et http://www.domaine.tld/feed/atom
, ces dernières ne renvoyant plus qu’une page vide.
Le problème se pose alors pour les blogs ayant déjà des abonnés aux anciens flux. Comment leur signaler la mise en place de la protection puisque vu d’un lecteur de flux RSS, ces derniers paraissent ne plus avoir changé du tout ? Ce qu’il faudrait dans l’idéal serait de fournir un flux RSS statique indiquant qu’il y a dorénavant une protection.
J’ai un peu fouillé le code du plugin, ouvert un ticket pour demander la prise en charge des anciennes URL des flux et en attendant j’ai choisi une autre solution que je vais détailler ici.
Un prérequis que je pense obligatoire — mais je serai peut-être détrompé par quelqu’un — est qu’il faut avoir fait le nécessaire pour supprimer la mention index.php
des URLs du blog. Un simple fichier .htaccess
suffit à faire cela :
RewriteEngine on RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule (.*) index.php/$1 RewriteRule ^index.php$ index.php/
À défaut les URLs originales des flux seraient http://www.domaine.tld/index.php/feed/rss2
et http://www.domaine.tld/index.php/feed/atom
ce qui rend impossible la technique que j’ai utilisée.
Ensuite j’ai simplement utilisé le fait qu’Apache (et probablement les autres serveurs web) teste la présence d’un fichier .html
ou .php
dans un répertoire donné avant tout. Donc si je crée un fichier rss2.php
et un fichier atom.php
dans un répertoire feed
, Apache doit alors les servir lorsqu’un abonné relève respectivement le flux RSS ou ATOM.
Il suffit ensuite que ces fichiers rss2.php
et atom.php
génèrent un simple flux statique pour prévenir le lecteur du changement. J’ai simplement repris le code source des flux générés par Dotclear, leur ai enlevé toute la partie contenant les billets en n’en laissant qu’un seul qui me servira alors de message et c’est ce flux simplifié que je renvoie.
Voilà le code du fichier rss2.php
:
<?php header('Content-Type: application/xml; charset=UTF-8'); echo <<<EOD <?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.domaine.tld/feed/rss2/xslt" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom"> <channel> <title>Mon blog</title> <link>http://www.domaine.tld/</link> <atom:link href="http://www.domaine.tld/feed/rss2" rel="self" type="application/rss+xml"/> <description>Mon petit blog à moi que j'ai</description> <language>fr</language> <pubDate>Wed, 08 Apr 2009 00:00:00 +0200</pubDate> <copyright>© Moi-même</copyright> <docs>http://blogs.law.harvard.edu/tech/rss</docs> <generator>Dotclear</generator> <item> <title>Private</title> <link>http://www.domaine.tld/</link> <guid isPermaLink="false">urn:md5:300df4c42465ce245ac2a02e5ee91a33</guid> <pubDate>Wed, 08 Apr 2009 00:00:00 +0200</pubDate> <dc:creator>Moi-même</dc:creator> <description> <p>Vous avez besoin du mot de passe pour accéder au blog et pour obtenir les nouvelles URL des flux RSS. Si vous ne le possédez pas vous pouvez en faire une demande à l'adresse suivante moi chez domaine.tld (en remplaçant chez par @ et en enlevant les espaces).</p></description> </item> </channel> </rss> EOD; ?>
Et voilà celui de atom.php
qui lui ressemble comme deux gouttes d’eau ou presque :
<?php header('Content-Type: application/atom+xml; charset=UTF-8'); echo <<<EOD <?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xml:lang="fr"> <title type="html">Mon blog</title> <subtitle type="html">Mon petit blog à moi que j'ai</subtitle> <link href="http://www.domaine.tld/feed/atom" rel="self" type="application/atom+xml"/> <link href="http://www.domaine.tld/" rel="alternate" type="text/html" title="Mon petit blog à moi que j'ai"/> <updated>2009-04-07T21:18:28+02:00</updated> <author> <name>Moi-même</name> </author> <id>urn:md5:e4c6ee9633392036a90c1798a6942634</id> <generator uri="http://www.dotclear.net/">Dotclear</generator> <entry> <title>Private</title> <link href="http://www.domaine.tld/" rel="alternate" type="text/html" title="Private" /> <id>urn:md5:300df4c42465ce245ac2a02e5ee91a32</id> <updated>2009-04-08T00:00:00+02:00</updated> <author><name>Moi-même</name></author> <content type="html"> <p>Vous avez besoin du mot de passe pour accéder au blog et pour obtenir les nouvelles URL des flux RSS. Si vous ne le possédez pas vous pouvez en faire une demande à l'adresse suivante moi chez domaine.tld (en remplaçant chez par @ et en enlevant les espaces).</p> </content> </entry> </feed> EOD; ?>
Voilà qui permet de s’assurer que Cool URI doesn’t change ;-)
1 De Lomalarch -
Je vais peut-être dire une ânerie mais il me semble que, pour que ça marche, il faut que le module MultiViews soit activé. Je n’ai pas entendu parler du fait qu’Apache, spontanément, vérifiait s’il n’y avait pas le fichier donné dans l’url en lui adjoignant d’autorité .html ou .php, mais je veux bien qu’on me montre la doc (j’aime m’instruire).
En tout cas, pour une solution « universelle », sans réécriture : je créerais les xml, les placerai à la racine de l’hébergement et définirais une règle de redirection des url normales de flux (avec un RedirectMatch, par exemple, pour couvrir toutes les possibilité) vers mes xml manuels. En revanche, j’eusse été bien en peine d’en produire le joli code que tu nous donnes :-)
Merci donc.
2 De Franck -
Tu as probablement raison pour le MultiViews, je n’y avais pas songé ! Il va falloir que je mette la main sur la doc et que je fasse quelques essais.
Ceci dit, ton idée de faire une redirection vers les flux placés à la racine est excellente.
3 De Osku -
Bon ok je vais m’occuper du ticket :)
4 De Franck -
Pas de problème Osku, prends ton temps, il y a des solutions alternatives qui peuvent être mises en place et qui sont non intrusives côté code.
5 De Osku -
Euh, affaire classée ?
6 De Franck -
Bonne question vu que je n’ai pas testé ta dernière version ;-)