
Redirects in Joomla
Elke website die lang genoeg bestaat, verzamelt uiteindelijk kapotte links. Artikelen worden hernoemd, secties worden herstructurerd en complete websites worden gemigreerd naar een nieuw platform. Elke wijziging kan URL’s breken waar andere websites, bladwijzers en zoekmachines nog steeds naar verwijzen.
Zonder een plan eindigt elke oude link op een generieke 404-pagina en verdampt de linkwaarde die jarenlang is opgebouwd langzaam.
Joomla lost dit probleem op met een kleine maar krachtige corecomponent genaamd Redirects (com_redirect). Deze registreert elke ontbrekende URL, laat je die doorsturen naar een werkende pagina en verzendt de juiste HTTP-statuscode naar browsers en zoekmachines. Geen .htaccess-aanpassingen en geen servertoegang nodig.
Hoe het Joomla Redirects-component kapotte links en oude URL’s onder controle houdt
Dit artikel legt uit hoe de Redirects-component werkt, hoe deze 404-fouten opvangt, hoe je hem gebruikt tijdens migraties en hoe je de meest voorkomende fouten voorkomt. Het doel is om beheerders, redacteurs en ontwikkelaars te helpen hun Joomla-sites schoon, snel en SEO-vriendelijk te houden.
1. De basis
1.1 Wat is de Redirects-component?
De Redirects-component (com_redirect) is Joomla’s ingebouwde hulpmiddel voor het beheren van HTTP-redirects en het registreren van 404-fouten (Pagina niet gevonden). Deze maakt sinds versie 1.6 deel uit van de Joomla-core.
Kort samengevat doet de component vier dingen:
- Hij bewaakt 404-fouten via de plugin System - Redirect.
- Hij registreert elke ontbrekende URL in de database, samen met de referrer en een hitteller.
- Hij laat je oude URL’s koppelen aan nieuwe URL’s met de juiste HTTP-statuscode.
- Hij ondersteunt bulkimport voor migraties, zodat je honderden redirects tegelijk kunt voorbereiden.
De workflow is eenvoudig: een oude URL geeft een 404 terug, Joomla registreert deze, een beheerder vult een nieuwe URL in en de volgende bezoeker wordt automatisch doorgestuurd.
1.2 Waar vind ik Redirects?
In de Joomla 6-backend zijn drie locaties relevant:
Componenten → Redirects (redirects en 404-log beheren)
Componenten → Redirects → Opties (componentinstellingen, ACL)
Systeem → Beheer → Plugins → System - Redirect (verzamelaar en handler)
De component bevindt zich in administrator/components/com_redirect/. De plugin die koppelt aan het foutensysteem bevindt zich in plugins/system/redirect/.
1.3 De twee onderdelen
De Redirects-functionaliteit bestaat uit twee onderdelen die samenwerken:
| Onderdeel | Rol |
|---|---|
com_redirect |
Backendbeheer, bulkimport, statuscodes. |
plg_system_redirect |
Luistert naar foutmeldingen en reageert op elke 404. |
Beide moeten ingeschakeld zijn. De component zonder plugin is slechts een passieve lijst. De plugin zonder component heeft niets om uit te lezen.
1.4 De plugin inschakelen
Een verse Joomla-installatie levert de plugin System - Redirect standaard uitgeschakeld mee. Totdat je deze inschakelt, werken geen redirects in de component en worden geen 404-fouten geregistreerd.
Ga naar Systeem → Beheer → Plugins, zoek op redirect en schakel de plugin in.
1.5 Je eerste redirect
Om handmatig een redirect aan te maken, open je Componenten → Redirects → Nieuw en vul je het volgende in:
| Veld | Voorbeeld |
|---|---|
| Oude URL | /oud-artikel |
| Nieuwe URL | /nieuw-mooi-artikel |
| Opmerking | "Hernoemd tijdens contentvernieuwing 2026" |
| Status | Ingeschakeld |
| HTTP-statuscode | 301 Permanent verplaatst |
Sla het formulier op en bezoek vervolgens /oud-artikel. De browser wordt doorgestuurd naar /nieuw-mooi-artikel met een 301-statuscode.
2. De 404-workflow
2.1 Hoe het verzamelen werkt
Met de plugin ingeschakeld en URL’s verzamelen = Ja, ziet de workflow er zo uit:
Bezoeker vraagt /ontbrekende-pagina op
└── Joomla genereert een 404
└── plg_system_redirect.onError wordt uitgevoerd
├── Controleert #__redirect_links op een gepubliceerde match
├── Indien gevonden → redirect met de opgeslagen statuscode
└── Indien niet → URL registreren (ongepubliceerd) voor latere afhandeling
Wanneer er geen match bestaat, toont Joomla nog steeds de 404-pagina aan de bezoeker. De URL wordt alleen stilletjes geregistreerd zodat de beheerder deze later kan afhandelen.
2.2 Verzamelingmodi
Twee pluginopties bepalen wat er wordt opgeslagen:
| Optie | Wat het doet |
|---|---|
| URL’s verzamelen | Aan = registreer elke nieuwe 404. Uit = alleen bestaande redirects uitvoeren, de lijst groeit niet verder. |
| URL inclusief domeinnaam opslaan | Sla de volledige https://site.tld/pad op (Ja) of alleen het pad /pad (Nee). |
Volledige URL’s zijn handig wanneer één Joomla-installatie meerdere domeinen bedient. Alleen paden opslaan is overzichtelijker voor één domein.
2.3 De 404-lijst beheren
Componenten → Redirects toont elke geregistreerde URL. Een typische workflow is:
- Sorteer op Hits aflopend, los eerst de meest bezochte 404’s op.
- Open een item, vul de Nieuwe URL in, kies de statuscode en zet deze op Ingeschakeld.
- Sla op. De redirect is actief en de regel is geen 404 meer.
- Verwijder ruis in bulk (spamscans, hackerpogingen, oude rommel).
De kolom Referrer laat zien waar de kapotte link vandaan komt. Een externe referrer betekent een inkomende link die je moet redirecten. Een interne referrer betekent een kapotte link binnen je eigen website die je beter direct kunt repareren.
2.4 URL’s uitsluiten van registratie
Een drukke website verzamelt veel rommel, scannerpogingen voor wp-admin, .env, phpmyadmin enzovoort. Je kunt deze direct uitsluiten via Systeem → Plugins → System - Redirect → URL’s uitsluiten.
Elke regel in het subformulier bevat:
| Veld | Betekenis |
|---|---|
| Term | Een padfragment of reguliere expressie. |
| Reguliere expressie | Behandel Term als regex (Ja/Nee). |
Twee patronen worden hardcoded overgeslagen: elke URL die mosConfig_ of =http bevat. Dit zijn klassieke injectiepatronen en Joomla registreert deze nooit.
3. HTTP-statuscodes
3.1 Waarom de statuscode belangrijk is
Een redirect betekent niet alleen "ga hierheen in plaats daarvan". De HTTP-statuscode vertelt browsers, crawlers en algoritmes voor linkwaarde waarom de URL is verplaatst.
| Code | Naam | Wanneer gebruiken |
|---|---|---|
| 301 | Permanent verplaatst | Artikel definitief hernoemd, SEO-waarde wordt doorgegeven. |
| 302 | Gevonden (tijdelijk) | Tijdelijke redirect, A/B-test, seizoenspagina. |
| 303 | See Other | Redirect na een POST-verzoek (formulieren). |
| 307 | Tijdelijke redirect | Zoals 302, maar behoudt de HTTP-methode. |
| 308 | Permanente redirect | Zoals 301, maar behoudt de HTTP-methode. |
In de dagelijkse praktijk gebruik je meestal slechts twee codes: 301 voor "de pagina is definitief verhuisd" en 302 voor "slechts tijdelijk".
3.2 Aangepaste statuscodes inschakelen
Standaard dwingt de component elke redirect naar een 301-statuscode, ongeacht wat je in de regel hebt geselecteerd. Om de statuscode per regel te respecteren, moet je één instelling inschakelen:
Componenten → Redirects → Opties → Aangepaste redirect-statuscodes gebruiken = Ja
Zonder deze instelling is de keuzelijst HTTP-statuscode per regel slechts decoratief. Schakel dit in voordat je een CSV importeert die zowel 301- als 302-codes bevat, anders worden alle geïmporteerde regels stilzwijgend omgezet naar 301.
3.3 Hoe de redirect eruitziet
Wanneer de plugin een redirect uitvoert, ziet de response er zo uit:
HTTP/1.1 301 Moved Permanently
Location: https://site.tld/new-shiny-article
De oorspronkelijke querystring blijft behouden als de oude URL in je regel zelf geen querystring bevat. Als je bijvoorbeeld /search?q=foo hebt opgeslagen, maakt de query deel uit van de match en wordt deze niet toegevoegd aan de doel-URL.
4. Bulkbewerkingen en migraties
4.1 Bulkimport
Bij migraties wil je redirects vrijwel nooit één voor één invoeren. De component ondersteunt een eenvoudig tekstformaat voor import, één redirect per regel:
/old-article-1|/new-article-1
/old-article-2|/new-article-2
/old-blog/2024/01/foo|/blog/foo
De standaard scheidingsteken is het pipe-teken (|). Je kunt dit wijzigen via Opties → Bulk-scheidingsteken als je URL’s pipes bevatten.
4.2 Standaardstatus voor geïmporteerde regels
Opties → Standaardstatus voor import bepaalt of geïmporteerde regels direct actief zijn:
| Keuze | Wat gebeurt er |
|---|---|
| Ingeschakeld | Geïmporteerde regels worden direct actief zodra de import klaar is. |
| Uitgeschakeld | Geïmporteerde regels blijven uitgeschakeld zodat je ze eerst kunt controleren. |
Kies Uitgeschakeld voor grote migraties die je eerst wilt testen. Kies Ingeschakeld voor betrouwbare CSV-exporten uit een bekende bron.
4.3 Het migratieplan
Wanneer je een website migreert, herstructureert of URL’s massaal hernoemt, helpen de volgende negen stappen om het proces beheersbaar te houden:
- Exporteer oude URL’s vóór de livegang. Crawl de livewebsite of haal ze uit
#__contentvia de router. Bewaar de lijst veilig. - Koppel oude URL’s aan nieuwe. Maak in een spreadsheet een koppeling tussen elke oude URL en de beste vervanger. Wees expliciet over URL’s zonder directe vervanging.
- Bepaal de standaardbestemming voor niet-gekoppelde URL’s. Meestal de categoriepagina, niet de homepage.
- Maak het importbestand in het formaat
oud|nieuwper regel. - Werk eerst in staging. Importeer in een testomgeving met Standaardstatus voor import = Uitgeschakeld en controleer steekproefsgewijs.
- Ga live. Zet de productieomgeving over, activeer de regels en controleer enkele redirects met
curl -I(zie sectie 9). - Controleer dagelijks het 404-logboek gedurende de eerste twee weken. Sorteer op hits en los de bovenste resultaten op.
- Vergelijk met Google Search Console. Het rapport Dekking / Niet gevonden laat zien welke kapotte URL’s nog geïndexeerd zijn.
- Controleer redirect-ketens en loops na één maand. Zie sectie 8 voor de SQL-query’s.
Een migratie is het enige moment waarop je daadwerkelijk een grote redirecttabel wilt hebben. Verwijder na drie maanden alles met nul hits.
5. De anatomie van een redirect
5.1 De enkele tabel
De volledige component draait op één databasetabel:
#__redirect_links één regel per redirect of geregistreerde 404
Geen taxonomie, geen aparte metadata-tabellen en geen varianten per taal. De belangrijkste kolommen zijn:
id auto-increment primary key
old_url de gematchte URL (geïndexeerd)
new_url de bestemming (NULL = onopgeloste 404)
referer waar de bezoeker vandaan kwam
comment vrije beheeropmerking
hits verhoogd bij elke match
published 1=Ingeschakeld, 0=Uitgeschakeld, 2=Gearchiveerd, -2=Verwijderd
created_date eerste keer dat deze URL werd gezien
modified_date laatste wijziging door beheerder
header HTTP-statuscode, standaard 301
Het veld old_url is de zoeksleutel. De index daarop houdt opzoekingen snel, zelfs met duizenden regels.
5.2 URL-normalisatie, de matchtruc
De plugin zoekt niet rechtstreeks op de ruwe URL die de bezoeker heeft opgevraagd. In plaats daarvan bouwt deze twaalf varianten op en voert één enkele WHERE old_url IN (...)-query uit:
1. Volledige URL (schema + host + pad + query + fragment)
2. Relatieve URL (pad + query + fragment)
3. Root-relative (Uri::root() verwijderd)
4. Root-relative met leidende "/"
5. Zonder query (schema + host + pad + fragment)
6. Relatief zonder query (pad + fragment)
7-12. Dezelfde zes, maar in kleine letters
Wat dit in de praktijk betekent:
- Je kunt
/oude-paginaofhttps://site.tld/oude-paginaopslaan. Beide werken. - Hoofdletters zijn belangrijk bij opslag, maar dankzij de lowercase-varianten vindt
/Old-Pagealsnog/old-page. - Een redirect voor
/foomatcht zowel/fooals/foo?utm=x. - Een redirect voor
/foo?bar=1matcht alleen/foo?bar=1. Querystrings inold_urlvereisen een exacte match.
5.3 De onError-hook
De plugin abonneert zich op één event:
public static function getSubscribedEvents(): array
{
return ['onError' => 'handleError'];
}
De handler stopt direct tenzij de foutcode exact 404 is en het verzoek niet uit het administrator-gedeelte komt. Backend-404’s worden bewust genegeerd, beheerders worden nooit doorgestuurd door hun eigen regels.
5.4 Waarom duplicaten gevaarlijk zijn
Wanneer de IN (...)-query meerdere regels retourneert, bijvoorbeeld omdat dezelfde URL zowel als volledige URL als relatieve URL is opgeslagen, kiest de plugin de eerste gepubliceerde match volgens de volgorde van de variantenlijst. De volledige URL komt eerst en wint dus van de relatieve URL.
De praktische regel: houd redirects in één consistente vorm, meestal root-relative paden. Sla dezelfde redirect niet op drie verschillende manieren op.
6. Rechten en workflow
6.1 ACL-acties
De component ondersteunt de standaard Joomla ACL-acties. Je stelt deze in via Componenten → Redirects → Opties → Rechten:
| Actie | Wat het regelt |
|---|---|
| Configureren | De componentinstellingen wijzigen. |
| Toegang tot beheerinterface | De Redirects-lijst openen. |
| Aanmaken | Nieuwe redirectregels toevoegen. |
| Verwijderen | Prullenbak legen en items verwijderen. |
| Bewerken | Bestaande regels aanpassen. |
| Status bewerken | Publiceren, depubliceren of archiveren. |
6.2 Aanbevolen rollen
Een veelgebruikte aanpak is om een SEO- of contentredactiegroep rechten te geven voor Aanmaken, Bewerken en Status bewerken, maar zonder toegang tot Configureren:
| Rol | Rechten | Dagelijkse taak |
|---|---|---|
| Super User | Alles | Eenmalige configuratie en import tijdens migraties. |
| SEO-editor | Aanmaken / Bewerken / Status bewerken | Wekelijks het 404-log controleren en de belangrijkste fouten oplossen. |
| Auteur | Geen | Kapotte links oplossen hoort bij redactiebeheer, niet bij auteurschap. |
7. Meertalige redirects
7.1 URL’s per taal
Op een meertalige Joomla-site heeft elke vertaling zijn eigen URL, meestal voorafgegaan door een taalcode:
/en/old-article → /en/new-article
/nl/oude-pagina → /nl/nieuwe-pagina
/de/altes-zeug → /de/neuer-artikel
De component com_redirect is taalonafhankelijk. Er bestaat geen language-kolom in #__redirect_links. De match gebeurt puur op basis van de URL-string, dus je moet de taalprefix zelf opslaan.
7.2 De valkuil van cross-language redirects
Twee verleidelijke maar foutieve patronen komen vaak voor:
/en/old-article → / (redirect naar homepage)
/nl/oude-pagina → /en/new-article (sprong naar andere taal)
Beide zorgen voor verwarring bij bezoekers en Google. Een Nederlandse bezoeker komt ineens op Engelstalige content terecht, of een Engelstalige bezoeker verliest volledig de context.
De regel is eenvoudig: redirect binnen dezelfde taal. Als een vertaling nog niet bestaat, stuur de URL dan door naar de dichtstbijzijnde equivalente pagina binnen dezelfde taal, bijvoorbeeld een categoriepagina of de homepage van die taal, niet naar de algemene site-root.
7.3 Menu-associaties versus redirects
Joomla’s meertalige menu-associaties regelen al “geef mij deze pagina in taal X” via de taalwisselaar. Dat is geen redirect maar een route.
Gebruik com_redirect alleen wanneer:
- Een artikel daadwerkelijk verhuisd is binnen één taal.
- Een volledig URL-patroon veranderde na een SEF-aanpassing in één taal.
- Een vertaling verwijderd werd en naar een logische bestemming moet verwijzen.
7.4 De valkuil van de Language Filter
De plugin System - Language Filter kan zelf redirects uitvoeren om een taalcode toe te voegen of te verwijderen. Wanneer beide plugins elkaar tegenspreken, ontstaat een redirectloop:
/article → /en/article (Language Filter)
/en/article → /article (jouw redirectregel)
/article → /en/article (weer dezelfde loop)
De oplossing is om de URL op te slaan nadat de Language Filter deze heeft verwerkt. Dat betekent dat je altijd de taalprefix opneemt in zowel old_url als new_url.
8. Prestaties en onderhoud
8.1 Hoe snel is het?
Elke 404 activeert één geïndexeerde IN (...)-query op #__redirect_links. Dankzij de index op old_url duurt dit slechts microseconden, zelfs bij 100.000 regels.
Het trage deel is de 404 zelf. Joomla initialiseert nog steeds de volledige applicatie voordat duidelijk wordt dat de route niet bestaat. De extra redirect-opzoeking daarbovenop is praktisch gratis.
8.2 Het logboek opschonen
Een drukke website, of een site die doelwit is van scanners en bots, verzamelt duizenden nutteloze URL’s. Een kwartaalopruiming is meestal voldoende:
- Filter op: Status = Uitgeschakeld (geregistreerd maar nooit opgelost).
- Sorteer op Hits = 0.
- Verplaats alles in bulk naar de prullenbak.
- Leeg de prullenbak.
De werkende redirects blijven intact en je verwijdert alleen de ruis.
8.3 Drie SQL-query’s die je wekelijks gebruikt
Bij meer dan enkele honderden regels wordt de backendlijst lastig te doorzoeken. Gebruik dan rechtstreeks SQL.
Top kapotte URL’s die je eerst moet oplossen, gesorteerd op hits en alleen de onopgeloste:
SELECT id, old_url, hits, referer
FROM jos_redirect_links
WHERE published = 0
AND new_url IS NULL
ORDER BY hits DESC
LIMIT 50;
Zoek redirectloops waarbij /a verwijst naar /b en /b weer terugverwijst naar /a:
SELECT a.old_url, a.new_url, b.new_url AS loops_to
FROM jos_redirect_links a
JOIN jos_redirect_links b
ON b.old_url = a.new_url
WHERE a.published = 1 AND b.published = 1
AND b.new_url = a.old_url;
Maak redirectketens vlak (/a → /b → /c wordt /a → /c):
UPDATE jos_redirect_links a
JOIN jos_redirect_links b
ON a.new_url = b.old_url
SET a.new_url = b.new_url
WHERE b.published = 1;
Voer dit meerdere keren uit totdat geen regels meer veranderen. Vervang jos_ door jouw eigen databaseprefix.
8.4 Wanneer de tabel te groot wordt
Als #__redirect_links miljoenen regels bevat, sla je vooral scannerverkeer op en geen echte 404-fouten. Mogelijke oplossingen:
- Schakel URL’s verzamelen tijdelijk uit totdat je de tabel hebt opgeschoond.
- Voeg brede patronen toe aan URL’s uitsluiten (
wp-,.env,.git). - Blokkeer veelvoorkomende scannerverzoeken direct op webserverniveau, zodat het verzoek PHP nooit bereikt.
9. Veelvoorkomende valkuilen
9.1 Mijn redirect werkt niet
Doorloop deze checklist in deze volgorde:
- Is
plg_system_redirectingeschakeld? - Staat de redirectregel op Ingeschakeld?
- Is de Nieuwe URL ingevuld (niet NULL)?
- Geeft de oude URL echt een 404 terug? Als de pagina nog bestaat, wordt geen redirect uitgevoerd,
com_redirectreageert alleen op 404-fouten. - Is de oude URL opgeslagen in een vorm die de matcher herkent? Root-relative is de veiligste keuze.
9.2 Mijn statuscode blijft altijd 301
De componentoptie Aangepaste redirect-statuscodes gebruiken staat standaard op Nee. Totdat je deze op Ja zet, wordt elke redirect als 301 verstuurd, ongeacht de instelling per regel.
9.3 Redirects werken niet in de backend
Dat is bewust zo ontworpen. De plugin stopt direct wanneer $app->isClient('administrator') waar is. De component werkt alleen aan de frontend.
9.4 De database blijft groeien
Dat komt door registratie, niet door redirects. Zet URL’s verzamelen = Nee om nieuwe registraties te stoppen. Bestaande gepubliceerde redirects blijven gewoon werken. Dit is handig voor websites die constant scannerverkeer ontvangen.
9.5 Redirectloops
De component voert geen loopdetectie uit. Als je /a → /b en /b → /a instelt, blijft de browser rondsturen totdat deze opgeeft. Gebruik de SQL-query uit sectie 8.3 na elke bulkimport om loops op te sporen.
9.6 Redirectketens
Een keten zoals /a → /b → /c → /d werkt omdat elke stap een apart verzoek is, maar elke extra stap kost een roundtrip en vermindert SEO-waarde. Maak ketens vlak met de SQL uit sectie 8.3.
9.7 Querystrings en fragmenten
- Querystring in
old_url: exacte match vereist. - Geen querystring in
old_url: matcht zowel met als zonder query. - Fragmenten (
#section): de browser verwijdert deze voordat het verzoek wordt verstuurd, dus je kunt niet redirecten op een fragment. Sla ze niet op.
9.8 SEF versus ruwe URL’s
Met SEF ingeschakeld is de zichtbare URL /old-article. Met SEF uitgeschakeld bevindt dezelfde content zich op /index.php?option=com_content&view=article&id=42. Dit zijn twee verschillende sleutels in de redirecttabel. Controleer je redirects opnieuw nadat je SEF hebt in- of uitgeschakeld.
9.9 Open-redirect beveiliging
De component laat je een oude URL doorsturen naar elke bestemming, inclusief externe domeinen. Dat is soms handig, maar het vormt ook een phishingrisico:
- Een gecompromitteerd beheerdersaccount kan redirects aanmaken naar een phishingwebsite die een bekend merk nabootst.
- Een vanuit zoekmachines geïndexeerde 404-URL kan worden doorgestuurd naar een schadelijke bestemming.
- Een oude redirect verwijst naar een domein dat verkocht werd en nu malware host.
De verdediging is eenvoudig: beperk de rechten Aanmaken en Bewerken op com_redirect tot een kleine, vertrouwde groep en controleer externe bestemmingen elk kwartaal:
SELECT id, old_url, new_url
FROM jos_redirect_links
WHERE published = 1
AND new_url LIKE 'http%'
AND new_url NOT LIKE 'https://site.tld/%';
9.10 Een redirect controleren met curl
Browsers cachen agressief en volgen redirects stilzwijgend. Gebruik voor debugging liever curl:
curl -I https://site.tld/old-article
Je wilt exact dit zien:
HTTP/2 301
location: https://site.tld/new-article
content-type: text/html; charset=utf-8
Een 200-response betekent dat de pagina geen 404 gaf en dus geen redirect werd uitgevoerd. Een 301 terwijl je een 302 verwachtte, betekent dat aangepaste statuscodes niet zijn ingeschakeld (zie sectie 3.2).
Gebruik -L en -v om een volledige redirectketen te volgen:
curl -I -L https://site.tld/old-article
Elke stap verschijnt in volgorde, ideaal om te controleren of een redirectketen correct is afgevlakt.
9.11 Redirect versus canonical
Een redirect en een canonical lijken op elkaar, maar lossen verschillende problemen op:
| Gebruik een redirect wanneer | Gebruik een canonical wanneer |
|---|---|
| De pagina echt verhuisd is. | Duplicaten bewust bestaan (printweergave, filters). |
| Je de oude URL wilt uitfaseren. | Beide URL’s toegankelijk moeten blijven. |
| Je bezoekers wilt doorsturen. | Je bezoekers op dezelfde pagina wilt houden. |
Beide combineren, een redirect plus een canonical op de doelpagina, is prima. Een canonical die verwijst naar een URL die zelf redirect, zorgt voor verwarring bij crawlers.
10. Onder de motorkap (developer view)
10.1 De matchflow
Voor developers die exact willen weten wat er gebeurt bij elke 404:
ErrorEvent (code 404)
└── handleError($event)
├── Stoppen bij backend of geen 404
├── 12 URL-varianten opbouwen (met/zonder schema, query, lowercase)
├── Overslaan als exclude_urls matcht OF mosConfig_ / =http bevat
├── SELECT * FROM #__redirect_links WHERE old_url IN (...)
├── Varianten in volgorde doorlopen, eerste gepubliceerde match kiezen
├── Statuscode forceren naar 301 tenzij optie "mode" op Ja staat
├── Hits verhogen, modified_date bijwerken
└── Location-header + statuscode versturen
10.2 Programmatic API
Je hebt zelden een API nodig voor redirects, omdat de tabel eenvoudig genoeg is om direct te beschrijven:
use Joomla\CMS\Factory;
$db = Factory::getContainer()->get('DatabaseDriver');
$db->setQuery(
"INSERT INTO #__redirect_links
(old_url, new_url, published, header, created_date, modified_date, hits, referer, comment)
VALUES
('/legacy', '/modern', 1, 301, NOW(), NOW(), 0, '', 'API insert')"
);
$db->execute();
10.3 Automatische redirect wanneer een artikelalias verandert
Een kleine custom plugin kan redacteurs veel werk besparen. Gebruik onContentAfterSave, detecteer een aliaswijziging en voeg automatisch een redirectregel toe:
public function onContentAfterSave($context, $article, $isNew): void
{
if ($context !== 'com_content.article' || $isNew) {
return;
}
if ($article->alias === $article->getOldAlias()) {
return;
}
$db = $this->getDatabase();
$db->setQuery(
"INSERT IGNORE INTO #__redirect_links
(old_url, new_url, published, header, created_date, modified_date)
VALUES (:old, :new, 1, 301, NOW(), NOW())"
)->bind(':old', $oldRoute)->bind(':new', $newRoute);
$db->execute();
}
10.4 Web Services API
Redirects zijn standaard niet beschikbaar via Joomla’s Web Services API. Als je beheer op afstand nodig hebt, bouw dan een kleine custom component rond de tabel of maak een lichte REST-plugin die LinkModel::save() aanroept.
10.5 Betere 404-pagina’s
De redirectplugin werkt alleen wanneer een 404 optreedt en geen match wordt gevonden. De bezoeker ziet nog steeds de 404-pagina. Je kunt die ervaring verbeteren door het volgende bestand te overriden:
templates/your_template/error.php
Een zoekveld (Smart Search), een module met populaire pagina’s, een sitemaplink, alles wat bezoekers helpt te vinden wat ze zochten. Een nette 404-pagina gecombineerd met een gezonde redirecttabel is de ideale combinatie. Redirect de kapotte links met veel verkeer en geef de rest een zachte landing.
11. Component versus webserver-redirects
Je kunt redirects ook configureren in Apache’s .htaccess of in een NGINX-configuratie. Elke laag heeft zijn eigen rol:
| Aspect | com_redirect | .htaccess / NGINX |
|---|---|---|
| Gebruiksvriendelijk voor redacteurs | Ja, via de backendinterface. | Nee, handmatige bestandsaanpassingen. |
| Statuscodes | Ja, na het inschakelen van de optie. | Ja. |
| Regex-patronen | Beperkt (alleen uitsluitingen). | Volledige regex-ondersteuning. |
| Prestaties | Pas na Joomla-bootstrap. | Vóór PHP start, veel sneller. |
| 404-registratie | Ingebouwd. | Handmatig logbestanden analyseren. |
| Hits per redirect | Ja. | Nee. |
| Bulkimport | Ja (via de interface). | Ja (via bestanden). |
| Detectie van loops of ketens | Nee. | Nee, maar eenvoudiger zichtbaar in configuratiebestanden. |
| Overleeft een Joomla-migratie | Ja (in de database). | Nee, gekoppeld aan serverbestanden. |
Gebruik com_redirect voor redactionele redirects, zoals hernoemde artikelen en migraties. Gebruik de webserver voor infrastructuurregels, zoals HTTPS forceren, www naar hoofddomein omleiden en scanners blokkeren. Lagen combineren is prima, lagen willekeurig combineren maakt alles juist kwetsbaar.
12. Best practices en cheat sheet
Als je slechts een paar dingen uit dit artikel onthoudt, laat het dan deze punten zijn:
- Schakel de plugin System - Redirect in. Zonder die werkt niets.
- Zet Aangepaste redirect-statuscodes gebruiken aan voordat je iets importeert.
- Sla URL’s altijd op in één consistente vorm, meestal root-relative paden.
- Redirect binnen dezelfde taal op meertalige websites.
- Maak redirectketens vlak en controleer op loops na elke bulkimport.
- Beperk ACL-rechten op
com_redirecttot een kleine, vertrouwde groep. - Gebruik
curl -Iom redirects te controleren, browsers verbergen te veel. - Ruim het logboek elk kwartaal op zodat de tabel snel en bruikbaar blijft.
Cheat sheet
COMPONENT Componenten → Redirects
PLUGIN Systeem → Plugins → System - Redirect
OPTIES Componenten → Redirects → Opties
CUSTOM CODES Opties → Aangepaste redirect-statuscodes gebruiken = Ja
404 VERZAMELEN Plugin → URL’s verzamelen = Ja
URL’S UITSLUITEN Plugin → URL’s uitsluiten subformulier (term + regex-vlag)
BULK IMPORT Werkbalk → Importeren (scheidingsteken standaard = "|")
TABEL #__redirect_links (één regel per redirect)
BELANGRIJKE VELDEN old_url, new_url, published, header, hits
STATUSCODES 301 (standaard), 302, 303, 307, 308
HARDCODED SKIP URL’s met mosConfig_ of =http
TRIGGER plg_system_redirect.onError, code 404, alleen frontend
MEERTALIG Geen language-kolom, sla taalprefix op in old_url
CONTROLEREN curl -I https://site.tld/old (gebruik daarna -L voor ketens)
GEEN CANONICAL Redirect vervangt de URL, canonical houdt deze actief
13. Samenvatting
De Redirects-component is misschien het kleinste onderdeel van Joomla, maar vaak ook het onderdeel dat zichzelf het snelst terugverdient. Eén plugin, één component en één instelling zorgen ervoor dat hernoemde artikelen hun inkomende links en zoekmachineranking behouden.
Met minimale configuratie krijg je:
- 404-registratie: elke kapotte link wordt opgeslagen met hits en referrer.
- Gebruiksvriendelijk beheer: geen
.htaccess-aanpassingen en geen devops-tickets nodig. - SEO-correcte statuscodes: 301-redirects behouden de opgebouwde linkwaarde.
- Bulkimport voor migraties: pipe-gescheiden lijsten voor grote migraties.
- Eenvoud van één tabel: makkelijk te back-uppen, te controleren en uit te breiden.
Een nette redirecttabel is een teken van een goed onderhouden Joomla-site. Als je een migratie plant, URL-structuren wijzigt of vermoedt dat kapotte links zoekverkeer kosten, loont het om eerst naar com_redirect te kijken. Het zit al in je Joomla-installatie en wacht alleen nog om ingeschakeld te worden.


Joomla en Linux specialist voor snelle, veilige en schaalbare websites.


