Zoals al besproken in het artikel over duplicate URL's kunnen canonical URL's gebruikt worden om een soort voorkeurs-URL in te stellen als dezelfde content via meerdere URL's kan worden bereikt. Het is een van de methodes die Google aanbeveelt om duplicate content te bereiken. Joomla 2.5 kende geen canonical URL's, maar Joomla 3 wel. Dat is een goede zaak, maar als je googelt op de term Joomla 3 canonical URL vindt je helaas veel forumposts over problemen hiermee. Laten we eens kijken hoe het nu eigenlijk werkt in Joomla.

Het concept van canonical URLs

Canonical URLs zijn in 2009 geintroduceerd door de zoekmachines om webmasters te helpen af te komen van duplicate content problemen. Veel CMS'en hebben er last van, en Joomla is simpelweg een van de velen. Voor die tijd moesten zoekmachines zelf maar uitzoeken welke versie geindexeerd moest worden. Vaak namen ze dan alle duplicaten maar op, maar dat devalueert natuurlijk de waarde van de individuele pagina's, met lagere rankings tot gevolg. Met de nieuwe techniek kun je dit nu oplossen. Een voorbeeld, stel we hebben deze 2 URLs in je site:

  • /blog
  • /index.php/blog

Je kunt met de canonical tag aangeven welke van deze 2 je voorkeur heeft (de eerst). Dat kan met de volgende code in je  HTML:

<link href="/......./blogl" rel="canonical" />

De link zou in ieder geval in de niet-voorkeursversie moeten staan (dit is de situatie vanaf Joomla 3.4), al is het geen probleem als deze ook in de voorkeurs-URL zelf staat. Weliswaar verwijst hij dan naar zichzelf, maar het voorkomt wel dat parameters is nde URL worden gezien als een aparte URL, zoals deze:

  • /blog?fontsize=small

Als de URL naar zichzelf verwijst is dat geen probleem.

Implementatie in Joomla

In Joomla 2.5 bestaan geen canonical URL's, daar heb je een extensie als SH404SEF voor nodig, of een extensie. In Joomla 3 zitten ze wel. Dat lost inderdaad een aantal problemen op, zoals het wel of niet bevatten van het index.php stukje (.../index.php/contact heeft nu een canonical verwijzend naar .../contact bijvoorbeeld). Helaas zijn er ook situaties waar dit niet goed gaat. Gelukkig wordt daar hard aan gewerkt, en hebben we hopelijk binnenkort een perfecte implementatie, maar het is een complex geheel, wat de ontwikkelaars behoorlijk wat hoofdbrekens kost.

Canonical URL voor niet-SEF URL's

Zoals je weet zijn ook als zoekmachinevriendelijke URL's aan staan de niet-SEF URL's nog steeds te benaderen, zoals bijvoorbeeld deze:

  • /index.php?option=com_content&view=article&id=1

Je zou hopen dat deze nu een canonical URL heeft die verwijst naar de SEF URL, maar helaas is dat niet altijd zo. Dit zou heel goed deze kunnen zijn:

  • /component/content/article?id=1

De niet-SEF URL verwijst dus naar een semi-SEF URL, wat niet correct is. Ook deze URL bestaat wel, en heeft dan weer een canonical URL die verwijst naar:

  • /component/content/article?id=article

Deze pagina bestaat niet eens, en levert een 404-fout op. Zo zijn er nog talloze voorbeelden, meestal voor non-SEF URL's (wat nog niet zo'n ramp is), maar soms ook voor specifieke lijst of blog-weergaves.

Oplossingen

Er zijn altijd wel oplossingen voorhanden, maar dit is een complex onderwerp. Als je er niet vertrouwd mee bent kun je er misschien maar beter afblijven, anders staan de volgende opties tot je beschikking:

  • Niet aan te raden, core hack: Sloop het tonen van de canonical uit Joomla (zit in /plugins/system/sef/sef.php rond regel 51)
  • Grote SEF extensies als SH404SEF en MijoSEF plaatsen zelf correcte canonical URLs
  • Er is een kleine plugin van Styleware die correcte canonical URL's zet: de Canonical plugin. Ik heb echter ook sites gezien waar de plugin problemen gaf, voorzichtig dus.
  • Een andere plugin is Canonical links all in one. Deze heb ik nog niet uitgeprobeerd.
  • Een nette methode is om de canonical tag in je template's index.php file te unsetten met de volgende code (oplossing van Robert Went)
$doc = JFactory::getDocument(); 
foreach ( $doc->_links as $k => $array ) {
if ( $array['relation'] == 'canonical' ) {
unset($doc->_links[$k]);
}
}

Joomla 3 wordt nog druk ontwikkelt, dus laten we hopen dat we deze oplossingen binnenkort niet meer nodig hebben. 

Update: In Joomla 3.4.1 is de status nog steeds zoals hier beschreven.