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

2007 02 23 door monchito | categorieën: monlog rss webdesign weblog seo 

rss codeOp 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 MONLOG 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 van MONLOG 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 MONLOG 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 :)

Tenslotte: de MONLOG RSS code

Ter leeringh ende vermaeck kunt u hier de MONLOG RSS code bekijken, voor zover deze betrekking heeft op wat hierboven beschreven is. Misschien vind je het ook wel interessant om nog wat veelvoorkomende XML-errors na te lezen. Doe er je voordeel mee ;)

Reacties

Test

door Test, 2007 05 15

Test

monchito

door monchito, 2007 05 16

test geslaagd?

Erik

door Erik, 2007 07 11

Ik kwam via het welbekende google op dit artikel terecht toen ik meer info zocht over het gebeuren.Leuk gedaan! Maar het zou nog "netter" kunnen als je gebruikt maakt van de XmlWriter class (en deze extend).Je feed bouw je dan bijvoorbeeld zo:

Erik

door Erik, 2007 07 11

Ah, die code slikt 'ie natuurlijk niet. Jammer :)

Warner

door Warner, 2007 08 13   Warner

Ik blijf tegen deze melding aanlopen: Your feed appears to be encoded as "ISO-8859-1", but your server is reporting "US-ASCII"Ook lijkt de feed valid maar kunnen nog niet alle partijen de feed goed inlezenMisschien zien jullie wat er mis is:www.fcutrecht.net/rss/rssfcutrecht.phpVast bedankt voor je hulp

monchito

door monchito, 2007 08 13   monchito

Je rss-bestand zelf moet ook ge-encode zijn als iso-8859-1, dus niet d einhoud van het bestand, maar het bestand zelf op de server. Dit kun je waarschijnlijk regelen in je ftp-client.

Warner

door Warner, 2007 08 13   Warner

Ik had gedacht het met een .htaccess bestand te regelen in mijn rss map met de volgende inhoudAddType application/x-httpd-php .xml AddType text/xml;charset=iso-8859-1 xml

monchito

door monchito, 2007 08 13   monchito

ik weet het niet 100% zeker (ben geen sysadmin), maar volgens mij betekent dit dat .xml bestanden als .php geparsed kunnen worden (regel 1) en dat de character set van .xml bestanden iso-8859-1 zou moeten zijn. Maar goed, 'zou moeten zijn' is niet hetzelfde als 'is'.. Lijkt mij nog steeds dat je het bestand zelf moet converteren naar iso

Warner

door Warner, 2007 08 14

Heb inmiddels het htaccess bestand verwijderd en op m'n webserver het formaat vam rssfcutrecht.php omgezet naar iso-8859-1, maar zie nog geen resultaat. Pff....Heb jij nog een suggestie ?

monchito

door monchito, 2007 08 14   monchito

Heb je nog bestanden geinclude in je rss-file? Dikke kans dat die ook geconverteerd moeten worden

Warner

door Warner, 2007 08 14

Bedoel je een include van een ander php script ? Ja er wordt inderdaad een include gedaan, ik zal deze ook naar iso-8859-1 converteren

Warner

door Warner, 2007 08 14

Include file ook aangepastFeedvalidator:Feeds should not be served with the "text/html" media typeYour feed appears to be encoded as "ISO-8859-1", but your server is reporting "US-ASCII"

monchito

door monchito, 2007 08 15   monchito

Hmm, dan weet ik het nu niet meer... Misschien heb je meer kans om hieruit te komen op het Gathering of Tweakers forum. Daar kom ik meestal terecht met dit soort vragen :)

Rants/opmerkingen/suggesties?

*
*

Let's get social

Wat is MONLOG

Sinds 2002 is MONLOG het weblog van Ramon Eijkemans, freelance SEO-gun for hire.

Dit weblog bevat how-to's, mijmeringen, soms wat humor. Het gaat vrijwel altijd over SEO. Ik herhaal geen nieuws en doe ook geen pogingen om SEO filosofisch te verklaren. Het doel van dit weblog is om jou van praktische informatie te voorzien!

En dan nog dit: guestpostings zijn welkom! Mail me als je je ei kwijt wil op dit goed rankende podium.

Laatste comments

Volgens mij is het een hele duidelijke tutorial alleen gek...
31.08.2010 door jasonz op Leer een website bouwen met PHP in 5 minuten

@chet Nice!
28.08.2010 door Ramon Eijkemans op custom RSS feeds van NU.nl en SEO

Ditzelfde grapje geldt ook voor video inhoud...
28.08.2010 door chet op custom RSS feeds van NU.nl en SEO

Hoi Kris, ik zou eerlijk gezegd niet weten waarom, maar...
28.08.2010 door Ramon Eijkemans op Gratis SEO scripts? Check MONLOG

Hallo, leuk initiatief.Ik had een vraagje mbt SEO en javas...
27.08.2010 door Kris | Spaarlampen op Gratis SEO scripts? Check MONLOG

Check ;)
27.08.2010 door Ramon Eijkemans op Gratis SEO scripts? Check MONLOG

Ja die ken ik wel :) Het schijnt nog niet mogelijk te zijn...
27.08.2010 door Bjorn van der Neut op Gratis SEO scripts? Check MONLOG

Leuk om te lezen hoe je het gehad hebt, en dan maandag écht...
26.08.2010 door renske op Op SEO avontuur in Moskou

Functioneel was het zeker :)
26.08.2010 door Ramon Eijkemans op Op SEO avontuur in Moskou

Mooi verhaal Ramon, klinkt als een functioneel bedrijfsuitje...
26.08.2010 door Roderick op Op SEO avontuur in Moskou