Terug naar hoofdinhoud

Joomla bestandsstructuur uitgelegd: wat elke map doet

13 augustus 2026

Als je een Joomla-installatie opent in een bestandsbeheerder, zie je zo’n twintig mappen met korte, op elkaar lijkende namen: components, modules, media, images, libraries, includes. In welke mappen staat jouw inhoud? Welke mappen worden bij een update overschreven? Waar mag je dingen plaatsen, en waar mag je absoluut niets aan raken? De meeste Joomla-problemen waarbij sprake is van "een bestand op de verkeerde plek" zijn terug te voeren op onbekendheid met deze structuur.

Dit artikel legt de bestands- en mappenstructuur van Joomla van boven tot onder uit. Het behandelt waar elke map voor is en welke van jou zijn voor site-eigenaren, de praktische wat-hoort-waar-beslissingen voor beheerders, en de padconstanten, het opstartproces en het autoladen voor ontwikkelaars. Het sluit aan op de Focus On-artikelen over templates, overrides, security hardening en troubleshooting - veel van hun regels worden vanzelfsprekend zodra je de kaart kunt lezen waarop ze opereren.

De mappenstructuur van Joomla is geen rommel. Het is een afspraak: elke map heeft één functie, en als je die functies kent, wordt het hele systeem voorspelbaar.

Het doel is eenvoudig: je naar elk pad in een Joomla-installatie laten kijken en weten wat het is, van wie het is, en of het daar thuishoort.

1. De basis

1.1 De root in een oogopslag

Een standaard Joomla 6-installatie heeft deze root (afgezien van je uploads en een eventueel verplaatste logs-map hoort er niets anders te staan):

administrator/    de backend-applicatie
api/              de Web Services-applicatie
cache/            gegenereerde pagina-/systeemcache
cli/              het commandline-toegangspunt
components/       frontend-componenten (de paginabouwers)
files/            JOUW geuploade documenten (bestandengebied mediabeheer)
images/           JOUW geuploade media
includes/         opstartbestanden voor de frontend
language/         frontend-taalbestanden
layouts/          gedeelde render-layouts (JLayout)
libraries/        het Joomla-framework + vendor-pakketten
media/            extensie-assets: css, js, fonts
modules/          frontend-modules
plugins/          alle plugins, gegroepeerd op type
templates/        frontend-templates
tmp/              kladruimte voor installaties en uploads

configuration.php je instellingen + inloggegevens
index.php         het frontend-toegangspunt
htaccess.txt      Apache-regels (hernoemen naar .htaccess)
web.config.txt    het IIS-equivalent
robots.txt        crawler-instructies
LICENSE.txt, README.txt   documentatie

1.2 Drie soorten dingen

SoortMappenWie schrijft hier
Toegangspunten index.php, administrator/, api/, cli/, includes/ Alleen Joomla.
Code components/, modules/, plugins/, templates/, libraries/, layouts/, media/, language/ Joomla en extensie-installers - nooit jij, met een uitzondering: de map html/ van je template.
Data images/, files/, cache/, tmp/, administrator/logs/, configuration.php Jij en Joomla tijdens runtime. Dit is het deel dat in elke back-up moet zitten.

1.3 De ene regel achter elke andere regel

Updates vervangen code; ze raken nooit datamappen of je template-overrides aan. Dat ene feit verklaart het advies dat door deze hele artikelserie heen terugkeert: aanpassingen horen in overrides en user.css (overleven updates), uploads horen in images/ (overleven updates), en bewerkingen binnen codemappen verdampen bij de volgende release.

Naar boven

2. De toegangspunten: vier deuren, een huis

2.1 Vier applicaties

Joomla is een codebase die vier applicaties draait, elk met een eigen voordeur:

ToegangspuntApplicatie
index.php De website die je bezoekers zien.
administrator/index.php De backend.
api/index.php De Web Services API (REST).
cli/joomla.php De commandoregel - geen webserver nodig.

Daarom zijn in het authenticatie-artikel site-login en API-login aparte rechten, en daarom werkt de CLI-reddingskit uit het troubleshooting-artikel terwijl de website plat ligt: verschillende deuren naar hetzelfde huis.

2.2 De map includes/

De includes/ van de frontend bevat drie kleine opstartbestanden: defines.php (de padconstanten uit sectie 9), framework.php (laadt het framework) en app.php (start de applicatie). index.php is maar een paar regels die deze binnenhalen - de toegangspunten zijn dunne deuren, niet het huis.

Naar boven

3. De extensiemappen

3.1 Een extensie, veel huizen

Een extensie is niet een map - haar onderdelen wonen waar hun functie het voorschrijft. Neem com_content, het artikelsysteem:

components/com_content/                 frontend-code + layouts
administrator/components/com_content/   backend-code, formulieren, access.xml
media/com_content/                      de css/js-assets
language/en-GB/com_content.ini          frontend-taalstrings
administrator/language/en-GB/...        backend-taalstrings
api/components/com_content/             de API-endpoints

Modules volgen dezelfde splitsing (modules/ en administrator/modules/), templates ook (templates/ en administrator/templates/). Plugins zijn de uitzondering: alle plugins wonen op een plek, plugins/{groep}/{naam}/, gegroepeerd op hun type - system, content, authentication, task, en de andere groepen die je door deze serie heen bent tegengekomen.

Binnen elk van die huizen volgt een moderne extensie een intern patroon:

src/                    namespaced PHP-klassen (het doel van de autoload-kaart)
tmpl/                   de layouts - overridebaar, zie het overrides-artikel
services/provider.php   registreert de services van de extensie (DI-bedrading)
forms/                  XML-formulierdefinities voor bewerkschermen

En hoe weet de installer in welke mappen een extensie schrijft? Elke extensie levert een manifest-XML mee (de templateDetails.xml uit het Cassiopeia-artikel is er een) die haar bestanden, mappen, taalbestanden en media declareert - de installer leest hem bij installatie, update en deinstallatie. Pas hier op met oude tutorials: extensies van voor Joomla 4 gebruikten helper.php-bestanden en assets in hun eigen mappen; het patroon src/-plus-services/ is het huidige.

3.2 layouts/: de gedeelde

De map layouts/ in de root bevat render-layouts die door alles gedeeld worden - paginering, aangepaste velden, formuliervelden. Het overrides-artikel behandelt hoe LayoutHelper ze vindt en hoe je template elk ervan kan overriden.

3.3 language/ en overrides

Taalbestanden installeren in language/{tag}/ per client. Je eigen tekstwijzigingen horen niet in die bestanden (updates vervangen ze) maar in taal-overrides, beheerd in de backend en opgeslagen onder language/overrides/ - hetzelfde overleef-de-update-patroon als template-overrides.

Naar boven

4. media/ versus images/: het onderscheid dat het meest telt

4.1 Twee mappen, twee eigenaren

De verwarring met de grootste gevolgen in de hele boom:

MapBevatEigenaar
images/ Jouw uploads: foto's, PDF's, logo's. Wat het mediabeheer toont. Jij. Updates blijven er altijd vanaf.
media/ Extensie-assets: de css, js, fonts en iconen die extensies en templates meeleveren. Installers. Updates vervangen de inhoud per extensie.

Upload de brochure van een klant naar media/ en hij kan verdwijnen met de volgende update van de map waarin hij belandde. Zet eigen CSS los in images/ en het werkt - maar zonder asset-beheer, zonder versionering, en met verbaasde opvolgers. Elke map doet zijn eigen taak goed en de taak van de ander slecht.

images/ heeft een broertje: files/, het aparte gebied van het mediabeheer voor niet-afbeelding-uploads (documenten, downloads), instelbaar via de optie file_path in de Media-instellingen. Dezelfde eigendomsregel geldt: het is van jou, updates blijven er vanaf, en het hoort in elke back-up.

4.2 De uitzonderingen die de regel bevestigen

Twee plekken in media/ zijn wel van jou, met opzet: media/templates/site/{template}/css/user.css en js/user.js (de update-bestendige eigen bestanden uit het Cassiopeia-artikel), en de mediamap van je eigen child template. Ze zijn van jou, juist omdat geen installer daar ooit schrijft.

4.3 Verkeerd verbonden

Sinds Joomla 4.1 wonen template-assets onder media/templates/ in plaats van in templates/{naam}/. De map templates/ houdt de PHP-kant - index.php, overrides in html/, het manifest - terwijl de browser-gerichte bestanden in media/ wonen. Als een tutorial je vertelt templates/cassiopeia/css/ te bewerken, beschrijft hij Joomla 3.

Naar boven

5. De datamappen

5.1 Wat runtime schrijft

  • cache/ en administrator/cache/: gegenereerde cache. Veilig te legen (Systeem → Cache legen), maar verwijder nooit de mappen zelf. Een speciaal bestand woont hier: administrator/cache/autoload_psr4.php, de class-map uit het troubleshooting-artikel.
  • tmp/: kladruimte voor extensie-installaties en uploads. Leeg hem gerust; een verkeerd tmp_path is de klassieke installatiefout.
  • administrator/logs/: de logbestanden van Joomla - update-logs, het log van mislukte logins, alles wat de taak rotatelogs roteert.

5.2 Verplaats ze naar buiten (het beveiligingsartikel, toegepast)

De paden van tmp/ en de logmap zijn instelbaar in de Algemene configuratie, juist zodat je ze buiten de webroot kunt zetten, en het artikel over security hardening raadt precies dat aan. De publieke-map-indeling in sectie 9.3 trekt hetzelfde idee door tot zijn conclusie.

5.3 configuration.php

Een bestand is de identiteit van de site: databasegegevens, de $secret-sleutel, elke waarde uit de Algemene configuratie. Het staat in de root, het zit in elke back-up, het gaat nooit in versiebeheer of een supportticket, en het advies uit het beveiligingsartikel om het alleen-lezen te maken (444) geldt. Als configuration.php plus images/ plus de database het overleven, overleeft je site.

Naar boven

6. administrator/ en api/: de spiegels

6.1 De backend is een tweede Joomla

administrator/ spiegelt de vorm van de root: eigen components/, modules/, templates/ (Atum woont hier), language/, includes/ en cache/. Twee mappen bestaan alleen hier: manifests/, de XML-manifesten van core-pakketten en -libraries (wat het extensiebeheer leest om te weten wat er geinstalleerd is), en help/ voor de helpschermen. En logs/, zoals hierboven behandeld.

6.2 api/ is een dunne spiegel

De api/-applicatie is bewust klein: index.php, includes/, language/ en components/ met alleen de API-endpoints van componenten die ze ondersteunen. Geen templates, geen modules - een API heeft geen van beide nodig. Die slankheid is het punt: het "alleen ruwe data"-gedrag uit het Web Services-artikel is direct zichtbaar in de maplijst.

Naar boven

7. libraries/: het framework zelf

7.1 Twee helften

  • libraries/src/: de Joomla CMS-klassen - elke Joomla\CMS\...-klasse die je in deze serie zag (Authentication, Access, LayoutHelper, Log) verwijst naar een bestand hier.
  • libraries/vendor/: pakketten van derden, beheerd via Composer - de Joomla Framework-pakketten, de databaselaag, PSR-interfaces en libraries zoals TUF voor update-verificatie.

7.2 Vrij lezen, nooit schrijven

libraries/ is de beste Joomla-documentatie die er is - deze hele artikelserie verifieerde zijn beweringen door deze bestanden te lezen. Maar het is ook de map waar "snelle fixes" de meeste schade aanrichten: een bewerking hier raakt alles, verdwijnt bij een update, en (zoals het troubleshooting-artikel zegt) een gewijzigd core-bestand is in een audit niet te onderscheiden van een hack. Dagelijks lezen; nooit schrijven.

Naar boven

8. Wat hoort waar: de praktische kaart

8.1 "Ik wil…"

Ik wil…Het hoort in…
Foto's en documenten uploaden images/, via het mediabeheer.
Eigen CSS of JS toevoegen media/templates/site/{child}/css/user.css - de manier van het Cassiopeia-artikel.
Extensie-markup wijzigen templates/{child}/html/ - de manier van het overrides-artikel.
Interfacetekst wijzigen Taal-overrides in de backend (language/overrides/).
Functionaliteit toevoegen Een geinstalleerde extensie - nooit losse bestanden in codemappen.
Back-ups opslaan Helemaal niet in de boom. Buiten de webroot, weg van de server (back-upartikel).

8.2 De gezonde-root-test

Een goed onderhouden Joomla-root bevat exact de items uit sectie 1.1 - niets meer. Elk extra item is een vraag waard: een backup.zip (beveiligingsrisico), een test.php (vergeten experiment of webshell), een map old/ (een complete tweede site met eigen verouderde kwetsbaarheden). De kwartaalcontrole op bestandsintegriteit uit het onderhoudsartikel is in wezen deze test, geautomatiseerd.

Naar boven

9. Onder de motorkap (ontwikkelaarsblik)

9.1 De JPATH-constanten

includes/defines.php benoemt elke locatie een keer, en alle core-code gebruikt de namen - en daarom werkt het verplaatsen van mappen uberhaupt:

JPATH_ROOT           de installatieroot
JPATH_SITE           root van de frontend-applicatie
JPATH_ADMINISTRATOR  de map administrator/
JPATH_API            de map api/
JPATH_LIBRARIES      libraries/
JPATH_PLUGINS        plugins/
JPATH_THEMES         de templatemap van de actieve client
JPATH_CACHE          de cachemap van de actieve client
JPATH_MANIFESTS      administrator/manifests/
JPATH_PUBLIC         de web-geserveerde root (standaard JPATH_ROOT)

Bouw in je eigen code paden altijd op vanuit deze constanten - JPATH_ROOT . '/images/...' - nooit vanuit geraden relatieve paden.

9.2 Van namespace naar bestand

Joomla laadt klassen automatisch door namespaces op mappen af te beelden. De gegenereerde kaart in administrator/cache/autoload_psr4.php toont het patroon letterlijk:

Joomla\CMS\...                          → libraries/src/...
Joomla\Component\Content\Site\...       → components/com_content/src/...
Joomla\Component\Content\Administrator\ → administrator/components/com_content/src/...
Joomla\Plugin\System\Debug\...          → plugins/system/debug/src/...

Lees een namespace en je kent het bestand; lees een pad en je kent de namespace. Deze afbeelding is ook waarom het verwijderen van de verouderde kaart de "class not found"-mysteries uit het troubleshooting-artikel oplost: de kaart zei het ene, de schijf het andere.

9.3 JPATH_PUBLIC en de publieke-map-indeling

JPATH_PUBLIC bestaat voor de indeling die het beveiligingsartikel voor nieuwe sites aanraadt: alleen de toegangspunten en web-assets in de geserveerde map, al het andere - code, configuratie, logs - een niveau boven de webroot, buiten bereik van elke URL. Op een klassieke installatie is de constante simpelweg gelijk aan JPATH_ROOT; de boom in dit artikel is de klassieke indeling.

Naar boven

10. De Web Services API

De structuur zelf is hier de les: api/components/ bevat een map per component die endpoints aanbiedt, en de webservices-plugingroep (in plugins/webservices/) registreert hun routes. Toen het API-artikel zei dat routes zoals v1/content/articles naar componentcode verwijzen, is dit de code waarnaar ze verwijzen. Een component zonder aanwezigheid in api/components/ heeft geen REST-oppervlak - de map controleren is de snelste manier om het te weten.

Niets in de bestandsboom wordt door de API geserveerd - die geeft database-content terug, geen bestanden. Bestanden die via het web bereikbaar zijn, serveert de webserver direct, en precies daarom zijn verdwaalde bestanden in de boom (sectie 8.2) een beveiligings- en SEO-zorg in plaats van een API-zorg.

Naar boven

11. SEO en metadata

De bestandsboom raakt SEO aan de randen, en de randen doen ertoe. Alles onder de webroot is potentieel crawlbaar: een vergeten old/-kopie van de site wordt geindexeerd als duplicate content, een verdwaalde databasedump kan in zoekresultaten belanden (het gebeurt - en het is eerst een datalek, daarna pas een SEO-probleem), en robots.txt - in de root, zoals behandeld in zijn eigen artikel - is je instrument om crawlers weg te sturen van wat niet geindexeerd hoort te worden.

De positieve kant woont in images/: beschrijvende map- en bestandsnamen (images/producten/blauwe-widget.webp verslaat images/IMG_4711.jpg) tellen mee voor beeldzoekresultaten, en een opgeruimde afbeeldingenboom laat redacteuren het juiste, geoptimaliseerde bestand kiezen in plaats van duplicaten opnieuw te uploaden - de afbeeldingsdiscipline uit het prestatie-artikel begint met mapdiscipline.

Naar boven

12. Veelvoorkomende fouten en valkuilen

12.1 Uploads in media/, assets in images/

Symptoom: documenten verdwijnen na een extensie-update, of eigen CSS zweeft onbeheerd in de uploadmap.

Oplossing: de regel van sectie 4: images/ is van jou, media/ is van de installers - behalve user.css/user.js en de mediamap van je child template.

12.2 Bestanden bewerken in codemappen

Symptoom: een aanpassing direct in components/, media/ of libraries/ verdwijnt na een update.

Oplossing: het contract van sectie 1.3: updates vervangen code. Doe de wijziging opnieuw als override, als user.css-regel of als nette extensie.

12.3 Back-ups en dumps binnen de boom

Symptoom: site-backup.zip of dump.sql in de root - downloadbaar voor iedereen die de naam raadt.

Oplossing: back-ups wonen buiten de webroot, punt. Het back-up- en het beveiligingsartikel staan er beide op, en de bestandsboom laat zien waarom: alles in de boom is potentieel publiek.

12.4 Mappen verwijderen in plaats van inhoud

Symptoom: na het "opruimen" overal cache- of tmp-fouten - de map zelf is weg.

Oplossing: cache/ en tmp/ moeten bestaan en beschrijfbaar zijn; alleen hun inhoud is wegwerpbaar. Maak de map opnieuw aan, zet maprechten 755, en gebruik volgende keer Systeem → Cache legen.

12.5 Onverklaarde bestanden als onschuldig behandelen

Symptoom: een test.php of vreemd genoemd bestand in de root "dat er waarschijnlijk altijd al stond".

Oplossing: niets in een Joomla-boom is onverklaard. Vergelijk met sectie 1.1 en een schone download; kun je een bestand niet verklaren, behandel het dan als incident response-terrein uit het beveiligingsartikel, niet als rommel.

12.6 De verkeerde configuration.php bewerken

Symptoom: configuratiewijzigingen hebben geen effect - bij inspectie bewaarde een editor een kopie (configuration.php.bak, of een in een submap) in plaats van het echte rootbestand.

Oplossing: het live bestand is exact JPATH_ROOT/configuration.php. Verwijder verdwaalde kopieen - ze bevatten inloggegevens en horen nergens anders.

Naar boven

13. Best practices

Als je maar een paar dingen uit dit artikel onthoudt, onthoud dan deze:

  • Ken de drie soorten: toegangspunten en code zijn van Joomla; images/, configuration.php en de runtime-mappen zijn de data van de site.
  • Uploads in images/, eigen assets in de user.css van je child template, markup-wijzigingen in html/-overrides, tekstwijzigingen in taal-overrides.
  • Schrijf nooit binnen codemappen - libraries/ is om te lezen.
  • Houd de root exact zoals geleverd: elk extra bestand is een vraag, en back-ups wonen volledig buiten de boom.
  • Verplaats tmp/ en logs uit de webroot; overweeg de publieke-map-indeling voor nieuwe sites.
  • Bouw paden in code op uit JPATH_*-constanten, en lees namespaces als routebeschrijvingen naar bestanden.
  • Bij twijfel van wie een map is: kijk of een update of installer er zou schrijven.
Naar boven

14. In het kort

VAN JOU      images/ + files/   uploads (mediabeheer)
             configuration.php  instellingen + inloggegevens (444, back-up!)
             templates/{child}/html/          overrides
             media/templates/site/{child}/    user.css, user.js
             language/overrides/              tekstwijzigingen

VAN JOOMLA   components/ modules/ plugins/ templates/ layouts/
             libraries/ (src = CMS-klassen, vendor = pakketten)
             media/  (extensie-assets - GEEN uploads)
             includes/ + index.php toegangspunten

RUNTIME      cache/ + administrator/cache/  (legen, nooit verwijderen)
             tmp/                           (klad, verplaatsbaar)
             administrator/logs/            (logs, verplaatsbaar)

SPIEGELS     administrator/  volledige backend (+ manifests/, help/, logs/)
             api/            dun: alleen componenten met REST-endpoints
             cli/joomla.php  de vierde deur

START        index.php > includes/defines|framework|app.php

PADEN        JPATH_ROOT SITE ADMINISTRATOR API LIBRARIES
             PLUGINS THEMES CACHE MANIFESTS PUBLIC
             namespace → pad: Joomla\Component\X\Site\
             = components/com_x/src  (kaart: autoload_psr4.php)

REGELS       updates vervangen code, nooit data of overrides
             root = alleen de geleverde lijst; extra's zijn vragen
             back-ups BUITEN de boom; media/ is niet images/
Naar boven

15. Samenvatting

De bestandsstructuur van Joomla is een klein systeem van contracten:

  • Drie soorten inhoud: toegangspunten, code en data - en alleen data (plus je overrides) is van jou om te beschrijven.
  • Vier deuren: site, administrator, API, CLI - een codebase, vier dunne toegangspunten.
  • Extensies wonen verspreid: frontend-, backend-, media-, taal- en API-delen elk in de map die hun functie voorschrijft; plugins gegroepeerd op type in een boom.
  • Het kritieke onderscheid: images/ is jouw media, media/ is extensie-assets - met user.css en child-templatemappen als de bewuste uitzonderingen.
  • Runtime-mappen (cache/, tmp/, logs) zijn wegwerpbaar in inhoud, onmisbaar in bestaan, en het best verplaatst uit de webroot.
  • Voor ontwikkelaars: JPATH_*-constanten benoemen elke locatie, namespaces verwijzen naar paden, en de publieke-map-indeling haalt de webserver weg bij alles behalve de toegangspunten.

Zodra de kaart in je hoofd zit, wordt de helft van deze artikelserie eenvoudiger: overrides, hardening, back-ups en troubleshooting worden allemaal toepassingen van "van wie is deze map, en wie schrijft hier?".

En is de boom van een site door de jaren heen mysterieus geworden - verdwaalde bestanden, dubbele kopieen, aanpassingen die niemand kan plaatsen - dan is een bestandsstructuur-audit tegen een schone Joomla methodisch, bevredigend werk: alles verklaard, verplaatst of verwijderd. Het is precies het soort voorjaarsschoonmaak dat een Joomla-specialist voor elke migratie doet, en de site is daarna veiliger en lichter.

Naar boven
Joomla bestandsstructuur uitgelegd: wat elke map doet
Peter Martin
Peter Martin
Joomla Specialist

Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.

Gerelateerde artikelen