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

«»

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

Door: monchito, vrijdag 23 februari 2007, 19:15 | Reacties: 13
Tag(s): RSS, Weblog SEO, Webdesign, Monlog

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

N.B.: Blijf op de hoogte van MONLOG door je te subscriben op de RSS-feed (ook voor comments).

Test

#1 | Test | dinsdag 15 mei 2007, 22:23

test geslaagd?

#2 | monchito | woensdag 16 mei 2007, 18:10

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:

#3 | Erik | woensdag 11 juli 2007, 17:28

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

#4 | Erik | woensdag 11 juli 2007, 17:30

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 inlezen

Misschien zien jullie wat er mis is:

www.fcutrecht.net/rss/rssfcutrecht.php

Vast bedankt voor je hulp

#5 | Warner | maandag 13 augustus 2007, 10:00

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.

#6 | monchito | maandag 13 augustus 2007, 11:52

Ik had gedacht het met een .htaccess bestand te regelen in mijn rss map met de volgende inhoud

AddType application/x-httpd-php .xml
AddType text/xml;charset=iso-8859-1 xml

#7 | Warner | maandag 13 augustus 2007, 19:59

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

#8 | monchito | maandag 13 augustus 2007, 20:57

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 ?

#9 | Warner | dinsdag 14 augustus 2007, 09:08

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

#10 | monchito | dinsdag 14 augustus 2007, 09:15

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

#11 | Warner | dinsdag 14 augustus 2007, 09:30

Include file ook aangepast

Feedvalidator:

Feeds should not be served with the "text/html" media type

Your feed appears to be encoded as "ISO-8859-1", but your server is reporting "US-ASCII"

#12 | Warner | dinsdag 14 augustus 2007, 09:53

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 :)

#13 | monchito | woensdag 15 augustus 2007, 15:14

Dit topic is gesloten. Reageren is niet (meer) mogelijk.

Dit topic is gesloten. Reageren is niet meer mogelijk... sorry!