Een RSS 2.0 feed met volledige HTML content in PHP/MySQL: 6 tips

Op het web wordt discussie gevoerd over het beste formaat voor een RSS-feed. Moet je nu een korte samenvatting geven of de volledige artikelen, inclusief afbeeldingen, links, koppen, lijsten, etc. weergeven? Meer en meer wordt gekozen voor het laatste en ik ben met ook overstag gegaan, ondanks mijn persoonlijke voorkeur voor korte samenvattingen in een RSS-feed. Ik heb er het een en ander van geleerd en dat ga ik hieronder met jullie delen.

De tips hieronder veronderstellen voorkennis van PHP, MySQL en RSS 2.0. Als je die nog niet hebt, kun je Googlen en deze meer geavanceerde RSS 2.0 specificatie bekijken.

Tip 1: onmisbare tool: de feed validator

Het eerste wat ik gedaan heb, is een alternatieve rss-feed bouwen op basis van mijn huidige en deze testen in een willekeurige rss-reader (in mijn geval Safari). Tevens meldde ik ‘m aan bij Feedburner, die aantoont of hij – wat Feedburner betreft – ok is.

De beste check die je echter kunt doen is bij feed validator, omdat deze het strengst is. Het gebruik ervan is simpel:

http://feedvalidator.org/check.cgi?url=< test rss feed >

Waar ‘<test rss feed>’ de url is van je test rss-feed. Ik gebruik deze tool op dezelfde wijze als de HTML validator: simpelweg elimineren van foutmeldingen totdat er geen meer over is.

Tip 2: HTML in een RSS feed: <content:encoded><!CDATA[

Als je HTML code wil opnemen in een RSS-feed, moet je aan een aantal regels voldoen. Ik kan hiervoor verwijzen naar een uitstekende handleiding op developer.mozilla.org. Let er in elk geval op dat je de juiste Document Type Definition gebruikt. Voor de RSS-feed  gebruik ik de volgende:

<rss version="2.0"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
>

Vervolgens kun je de xml tag ‘<content:encoded>’, in combinatie met de XML vuilnisbak <![CDATA[ ]]> gebruiken om je HTML in te dumpen:

<content:encoded><![CDATA[< je HTML code >]]></content:encoded>

Tip 3: Beveiliging met strip_tags()

Nu ben je er nog niet, want niet alle HTML wordt geaccepteerd in een RSS-feed, omdat er veiligheidsrisico’s aan zitten. De volgende tags mogen niet voorkomen:

script, embed, object, frameset, frame, iframe, link, meta, style

Ik heb zelf gekozen voor de eenvoudige strip_tags() php-functie die ongewenste HTML-tags uit de feed sloopt:

$rss = strip_tags($rss,'<a><img>');

De oplettende bezoeker weet dat strip_tags() niet volledig veilig is, omdat style en onmouseover attributen daarmee kunnen blijven bestaan. Maar voor de rss-feed is het voldoende. Ik ga zelf mijn eigen HTML niet hacken. Als je een RSS-feed maakt van comments of van externe websites, dan moet je die extra beveiliging wel gebruiken. Op de strip_tags() pagina van de php-handleiding vind je bruikbare voorbeelden die extra beveiliging bieden.

Tip 4: Datumweergave in RFC-822 met MySQL / PHP

Bij het maken van RSS-feeds is er altijd veel gedoe over de juiste datumnotatie. In RSS 2.0 kun je de tag <pubDate> gebruiken, die vervolgens in de zogenaamde RFC-822 notatie opgemaakt moet zijn, bijvoorbeeld: Sat, 07 Sep 2002 00:00:01 GMT.

De beste manier om dit te doen is door je MySQL data al in de gewenste notatie uit de database te halen door gebruikmaking van de DATE_FORMAT() functie:

DATE_FORMAT(date,'%a, %d %b %Y %T') AS rfcpubdate

De volledige RFC-822 datum moet nog een timezone value hebben. Deze wordt niet meegegeven door de DATE_FORMAT() functie, dus die moet je zelf nog toevoegen:

$date = "".$row['rfcpubdate']." ".date('O').";

Vervolgens toon je deze in je rss-feed:

<pubDate>".$date."</pubDate>

Tip 5: negeer rss validator foutmeldingen voor interne links

Ikzelf maak als ik langere artikelen schrijf vaak gebruik van interne HTML ankers, maar blijkbaar worden deze niet geaccepteerd binnen een RSS-feed als je geen absolute url ervoor zet, waardoor de feed validator er altijd over zal blijven zeuren. Je kijgt dan de foutmelding content:encoded should not contain relative URL references.

Ik heb opgezocht hoe ik hiermee om moest gaan (en ja, ik weet dat je eigenlijk altijd absolute urls moet gebruiken, maar daar heb ik op mijn eigen log geen zin in :p). Feedburner vindt het parsen van een HTML-RSS feed met relatieve interne ankers geen probleem en ook de makers van WordPress vinden het een non-issue. Als zij het prima vinden, dan vind ik dat ook 🙂

0 Comments

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *