Terug naar hoofdinhoud

Wrapper in Joomla

27 juni 2026

Soms wil je een andere website niet nabouwen in Joomla. Je wilt hem alleen tonen: een boekingskalender, een oude PHP-tool, een kaart, een formulier dat ergens anders draait. Joomla heeft hier een klein, vaak vergeten core-component voor: de Wrapper.

Het Wrapper-component (com_wrapper) doet maar een ding. Het plaatst een <iframe> op een Joomla-pagina en wijst dat naar een URL. De externe pagina laadt in een frame op jouw site, omlijst door de header, footer en het menu van je template. Er is geen content om te schrijven, geen record om op te slaan, alleen een URL en een paar weergave-instellingen.

Joomla's component met een enkel trucje: verpak elke externe pagina in een iframe, rechtstreeks vanuit een menu-item.

Dit artikel legt uit hoe de Wrapper echt werkt. Het behandelt de basis voor website-eigenaren, de instellingen voor beheerders en de technische details voor ontwikkelaars. Je leert hoe je een wrapper maakt, hoe Joomla de URL herschrijft, waarom "auto height" vaak mislukt, hoe de module mod_wrapper verschilt, en de beveiligingsregels die bepalen of de externe pagina uberhaupt laadt.

1. De basis

1.1 Wat een Wrapper is

Een Wrapper is een <iframe> met een Joomla-menu-item ervoor. Als een bezoeker op de menulink klikt, rendert Joomla een normale pagina met jouw template, en in het contentgebied plaatst het een enkel frame dat een ander webadres laadt.

Zie het als een raam. Jouw template is de muur. Het iframe is het raam. Door het raam zie je een compleet aparte webpagina, geserveerd door een ander script of zelfs een andere server.

De Wrapper kopieert, importeert of bewaart de externe pagina niet. Het vertelt de browser alleen: "laad deze andere URL in dit vak."

1.2 Wat het bijzonder maakt

Bijna elk core-component van Joomla slaat iets op: artikelen, contacten, banners, feeds. De Wrapper slaat niets op. Het heeft:

  • Geen eigen databasetabel.
  • Geen categorieen.
  • Geen aangepaste velden.
  • Geen beheerscherm waar je "wrapper-records" maakt.
  • Geen Web Services (REST) API.

Alles wat een wrapper nodig heeft - de URL, de breedte, de hoogte - staat in de menu-item-parameters. Het menu-item is de wrapper. Verwijder het menu-item en de wrapper is weg.

1.3 Waar je het vindt

Je vindt geen "Wrapper" onder het Componenten-menu, want daar valt niets te beheren. Je maakt een wrapper als een menu-itemtype:

Menu's → (jouw menu) → Nieuw → Iframe Wrapper

In de keuzelijst voor menu-itemtypes staat het onder Wrapper als Iframe Wrapper. Die ene layout is de hele frontend van het component.

Naar boven

2. Een Wrapper-menu-item maken

2.1 De stappen

Een wrapper maken kost minder dan een minuut:

  1. Ga naar Menu's → (jouw menu) → Nieuw.
  2. Zet Menu-itemtype op Wrapper → Iframe Wrapper.
  3. Vul een Menutitel in (dit wordt de paginatitel en de linktekst).
  4. Typ in het veld URL het adres dat je wilt verpakken, bijvoorbeeld https://example.com/tool.
  5. Opslaan.

Meer is strikt genomen niet nodig. De overige opties bepalen de grootte, schaling en het laadgedrag.

2.2 Het verplichte veld: URL

De enige verplichte instelling is de URL. In het menu-item zit die in de fieldset Basic en is zo gedefinieerd:

<field name="url" type="url" validate="url"
       filter="url" relative="true" required="true" />

Omdat relative="true" aanstaat, accepteert Joomla zowel absolute adressen (https://example.com/page) als adressen relatief aan je eigen site (/some/local/page). Hoe Joomla wat je typt omzet naar het uiteindelijke src-attribuut, lees je in sectie 4.

Naar boven

3. De Wrapper-opties uitgelegd

Een wrapper-menu-item biedt een kleine, vaste set parameters. Ze zijn gegroepeerd in drie fieldsets in tmpl/wrapper/default.xml.

3.1 Basic (Scroll Bar Parameters)

OptieParamStandaardWat het doet
Width width 100% De breedte van het iframe. Een percentage schaalt mee met de pagina; een getal wordt als pixels behandeld.
Height height 500 De hoogte van het iframe in pixels. Een frame heeft geen natuurlijke hoogte, dus die moet je instellen.

3.2 Advanced

OptieParamStandaardWat het doet
Auto Height height_auto 0 (Nee) Probeert het frame met JavaScript op de inhoud te laten passen (zie sectie 5).
Auto Add add_scheme 1 (Ja) Voegt een schema (http:// of https://) toe aan de URL als je dat niet hebt getypt.
Lazy Loading lazyloading lazy Stelt het loading-attribuut van het iframe in. lazy stelt het frame uit tot het bijna in beeld komt; eager laadt het meteen.

Let op een naamkundig detail: het label is Auto Add, maar de opgeslagen parameter heet add_scheme. De beschrijving in de backend legt het goed uit: standaard wordt http:// toegevoegd, tenzij Joomla http:// of https:// in de opgegeven URL detecteert.

3.3 Pagina-weergave (overgeerfd)

Zoals elk menu-item heeft een wrapper ook het standaard tabblad Pagina-weergave: Browserpaginatitel, Toon paginakop en Paginakop. De layout gebruikt deze om een optionele <h1> boven het frame te tonen en om het title-attribuut van het iframe te zetten - wat belangrijk is voor toegankelijkheid.

Naar boven

4. Hoe de URL verwerkt wordt

Dit is het deel dat de meeste mensen nooit zien, en het verklaart een paar "waarom is mijn link veranderd?"-verrassingen. Als Auto Add (add_scheme) aanstaat - de standaard - herschrijft de view de URL voordat die wordt afgedrukt.

4.1 De vier gevallen

De logica zit in de frontend-view (HtmlView.php) en loopt op volgorde door de URL die je typte:

Wat je typteWat Joomla doetResultaat
//example.com/x Plaatst het huidige schema ervoor. https://example.com/x
/local/page Plaatst schema + host + poort ervoor (je eigen site). https://yoursite.test/local/page
example.com/x (geen schema) Plaatst het huidige schema ervoor. https://example.com/x
https://example.com/x Laat het ongewijzigd. https://example.com/x

Met "huidige schema" bedoelen we wat je Joomla-pagina op dit moment gebruikt, meestal https://. Daarom komt een verpakte URL bijna altijd op HTTPS uit als je eigen site op HTTPS draait.

4.2 Wanneer je Auto Add uitzet

Zet Auto Add op Nee wanneer je de URL precies door wilt geven zoals je hem typte - bijvoorbeeld een niet-standaard schema, of een URL waar automatische schema-verwerking in de weg zit. Met de optie uit gebruikt de view jouw waarde letterlijk.

// HtmlView.php (vereenvoudigd)
if ($params->def('add_scheme', 1)) {
    // de vier gevallen hierboven
} else {
    $wrapper->url = $url;   // gebruik precies wat is getypt
}
Naar boven

5. Auto Height en het iFrame-script

Een iframe groeit niet mee met zijn inhoud zoals een gewone <div> dat doet. Je geeft het een vaste hoogte, en alles wat hoger is scrollt binnen het frame. Auto Height is Joomla's poging om dat op te lossen.

5.1 Hoe het werkt

Als height_auto aanstaat, voegt de view een onload-handler toe aan het iframe:

<iframe onload="iFrameHeight(this)" ... >

De handler zit in het eigen script van het component, media/com_wrapper/js/iframe-height.js. Simpel gezegd doet het dit:

1. Lees de binnenpagina zodra het frame klaar is met laden.
2. Meet document.body.scrollHeight.
3. Zet de iframe-hoogte op die waarde + 60px (een kleine marge).

Het resultaat is een frame dat hoog genoeg is om de verpakte pagina te tonen zonder interne scrollbalk.

5.2 De grote valkuil: alleen same-origin

iframe.contentDocument.body.scrollHeight lezen betekent in de verpakte pagina reiken. Browsers staan dat alleen toe als de verpakte pagina dezelfde origin heeft (zelfde schema, host en poort) als je Joomla-site.

Dus Auto Height werkt alleen als je een pagina op je eigen domein verpakt. Wijs je naar een ander domein, dan blokkeert het same-origin-beleid van de browser de meting. Het script faalt stilletjes en het frame houdt zijn vaste height.

Vuistregel: Auto Height is voor het verpakken van je eigen oude pagina's. Stel voor externe sites een verstandige vaste hoogte in.
Naar boven

6. Het alternatief als module: mod_wrapper

Het component zet een iframe op zijn eigen pagina via een menu-item. De core-module Wrapper (mod_wrapper) zet hetzelfde soort iframe in een modulepositie - een zijbalk, een footer, overal waar een positie bestaat - bovenop andere content.

Content → Sitemodules → Nieuw → Wrapper   (mod_wrapper)

6.1 Component versus module

 com_wrappermod_wrapper
Waar het verschijnt Eigen pagina (menu-item) Elke modulepositie
Menu-item nodig Ja Nee
Standaard hoogte 500 200
Standaard Auto Height Uit Aan
Frame target/naam Vast (iframe) target-veld dat je kunt instellen
Module-caching n.v.t. Ja (statische cache, standaard 900s)
Geschikt voor Een volledige pagina die een externe tool verpakt Een klein verpakt blokje naast je content

6.2 Gedeelde code

Beide gebruiken precies dezelfde JavaScript-asset, com_wrapper.iframe (iframe-height.min.js). Het component en de module zijn twee frontends over een idee: een <iframe> renderen. Gebruik het component als de verpakte pagina de pagina is; gebruik de module als die naast je echte content staat.

Naar boven

7. Onder de motorkap (ontwikkelaarsblik)

7.1 Geen tabel, geen modeldata

Er is geen #__wrapper-tabel. Het component leest alles uit de parameters van het actieve menu-item:

$params = Factory::getApplication()->getParams();
$url    = $params->def('url', '');

Dat is de hele gegevensbron. Het "model" heeft niets te laden, want de pagina die je ziet staat op een andere server.

7.2 Waar de instellingen echt staan

"Geen eigen tabel" betekent niet "nergens opgeslagen". Een wrapper leunt op twee gedeelde core-tabellen:

TabelWat het bevat voor de Wrapper
#__menu Het wrapper-menu-item zelf. De kolom params bewaart de URL, breedte, hoogte en de overige opties als JSON.
#__extensions De registratie van het component com_wrapper (de namespace, manifest cache en of het ingeschakeld is).

De configuratie die je in het menu-item instelt belandt dus als JSON-string in #__menu.params:

SELECT id, title, params
FROM #__menu
WHERE link LIKE '%com_wrapper%';

-- params (gedecodeerd):
-- {"url":"https://example.com","width":"100%","height":"500",
--  "height_auto":"0","add_scheme":"1","lazyloading":"lazy"}

Joomla laadt die JSON in een Registry-object, en dat is precies wat $params->get('url') in de view leest. Daarom verwijdert het verwijderen van het menu-item ook de wrapper: de menuregel is de opslag.

7.3 De MVC-indeling

Het component is een van de kleinste in Joomla:

administrator/components/com_wrapper/      ← registreert het component + de router
   src/Extension/WrapperComponent.php
   services/provider.php

components/com_wrapper/                     ← de hele frontend
   src/Controller/DisplayController.php     forceert caching, zet de view
   src/View/Wrapper/HtmlView.php            bouwt de URL + params
   src/Service/Router.php                   triviale SEF-routing
   tmpl/wrapper/default.php                 print het <iframe>
   tmpl/wrapper/default.xml                 de menu-item-opties

Er is een beheerderskant, maar die bestaat alleen om het component en de router te registreren zodat het menu-itemtype beschikbaar is. Er is geen beheerscherm.

7.4 De controller forceert caching

De display-controller zet caching hard aan:

public function display($cachable = false, $urlparams = [])
{
    $cachable = true;   // altijd cachen
    $vName    = $this->input->get('view', 'wrapper');
    $this->input->set('view', $vName);

    return parent::display($cachable, ['Itemid' => 'INT']);
}

Dat is goedkoop en veilig: de uitvoer is alleen een <iframe>-tag, identiek voor elke bezoeker van dat menu-item. Het dure deel - de verpakte pagina laden - gebeurt in de browser van de bezoeker, niet op jouw server, dus er valt sowieso niets zwaars te cachen.

7.5 De router is bijna leeg

Omdat er maar een view is en geen records, doet de router nauwelijks iets:

public function build(&$query) {
    unset($query['view']);   // niets te coderen
    return [];
}
public function parse(&$segments) {
    return ['view' => 'wrapper'];   // altijd dezelfde view
}

In de praktijk is de SEF-URL simpelweg de alias van het menu-item. Er zijn geen id's, slugs of extra segmenten om te routeren.

7.6 Wat de template print

De uitvoer van de layout is kort. Zonder het kop-blok is het in essentie:

<div class="com-wrapper contentpane">
  <iframe id="blockrandom" name="iframe"
          src="/(de verwerkte URL)"
          width="(width)" height="(height)"
          loading="(lazy|eager)"
          title="(paginakop of titel)"
          class="com-wrapper__iframe wrapper">
    This option will not work correctly. Unfortunately, your
    browser does not support inline frames.
  </iframe>
</div>

De tekst binnen het iframe is de fallback voor browsers die geen frames kunnen renderen - vandaag de dag vrijwel geen enkele, maar het is correcte HTML om die te bieden.

7.7 Template-overrides

Je kunt de layout overriden zoals elke andere view:

components/com_wrapper/tmpl/wrapper/default.php
templates/<jouw_template>/html/com_wrapper/wrapper/default.php   ← override

Dit is de juiste plek om een omhullend element, extra ARIA-attributen, een responsieve aspect-ratio-box of een sandbox-attribuut op het iframe toe te voegen (zie sectie 8).

Naar boven

8. Beveiliging: iframes en de buitenwereld

De Wrapper is eenvoudig in gebruik, maar raakt aan een van de lastigste gebieden van het web: de ene site in de andere insluiten. De meeste "de wrapper is leeg"-problemen zijn beveiligingsfuncties die hun werk doen.

8.1 De andere site bepaalt of die geframed mag worden

Je kunt een wrapper overal heen wijzen, maar de doelsite bepaalt of browsers die in een frame mogen tonen. Twee response-headers regelen dit:

HeaderEffect als de doelsite die stuurt
X-Frame-Options: DENY / SAMEORIGIN De browser weigert de pagina in jouw frame te tonen.
Content-Security-Policy: frame-ancestors ... Het moderne equivalent; geeft precies aan wie de pagina mag framen.

Grote sites (Google, de meeste banken, veel SaaS-apps) sturen deze bewust om clickjacking te voorkomen. Toont een wrapper een leeg of geweigerd frame, dan is dit bijna altijd de reden - en er is aan de Joomla-kant niets dat je kunt veranderen om dit te omzeilen.

8.2 Gemengde inhoud (mixed content)

Draait je Joomla-site op HTTPS en verpak je een http://-URL, dan blokkeert de browser het onveilige frame als mixed content. Verpak altijd HTTPS-doelen. (De schema-verwerking van Auto Add duwt je meestal toch al naar HTTPS, zoals in sectie 4 staat.)

8.3 Cookies en logins binnen een frame

Dit is de val waar mensen in trappen die een applicatie met login verpakken. Als de geframede app op een ander domein staat dan je Joomla-site, is de sessiecookie een third-party cookie, en moderne browsers beperken die streng.

Bepalend is het SameSite-attribuut van de cookie op de doelapp:

Cookie-instellingGedrag binnen jouw frame
SameSite=Lax / Strict De cookie wordt niet meegestuurd in het geframede (cross-site) verzoek, dus de app ziet de sessie nooit.
SameSite=None; Secure De cookie kan worden meegestuurd, maar alleen via HTTPS - en browsers partitioneren of blokkeren deze steeds vaker ook.

De gebruikelijke symptomen zijn een login-loop (de app blijft om inloggen vragen), verloren sessies, of authenticatie die wel werkt in een gewoon tabblad maar niet in het frame. Er is geen Joomla-instelling die dit oplost: de cookieregels horen bij de doelapp en de browser. De verpakte app moet SameSite=None; Secure sturen (en vaak storage access aanvragen) om logins in een frame te laten werken, of je houdt de verpakte app op je eigen domein.

8.4 Clickjacking - de andere richting

Framen werkt twee kanten op. Als jouw site door iedereen geframed kan worden, kan een aanvaller die overlayen om gebruikers te misleiden. Bescherm je eigen pagina's door X-Frame-Options of een frame-ancestors-beleid te sturen. De HTTP Headers-plugin van Joomla kan beide instellen.

8.5 Het frame dat je insluit hardenen

Verpak je content van derden, behandel die dan als onbetrouwbaar. In een template-override kun je een sandbox-attribuut toevoegen om te beperken wat de geframede pagina mag doen:

<iframe ... sandbox="allow-scripts allow-same-origin">

Voeg alleen de mogelijkheden toe die de ingesloten tool echt nodig heeft. Beperk ook wie wrapper-menu-items mag maken of bewerken, want een menu-item is het enige dat tussen een URL en de browsers van je bezoekers staat.

Naar boven

9. SEO en metadata

Een wrapper-pagina is een van de zwakste pagina's die je voor zoekmachines kunt publiceren, en het helpt te begrijpen waarom.

  • Zoekmachines indexeren geframede inhoud niet als de jouwe. De tekst binnen het iframe hoort bij de andere URL. Google schrijft die toe aan die site, niet aan jouw wrapper-pagina.
  • Je wrapper-pagina heeft bijna geen eigen tekst - alleen een optionele kop en een frame. Er valt voor een crawler weinig te ranken.
  • De view stelt nog steeds metadata in. De browserpaginatitel, meta description en robots uit het tabblad Metadata van het menu-item worden toegepast, dus je kunt op zijn minst de titel en noindex sturen indien nodig.

Is een pagina belangrijk voor SEO, verpak die dan niet - bouw die content na als een echt Joomla-artikel. Reserveer de Wrapper voor tools en hulpmiddelen waar ranking niet uitmaakt: dashboards, rekenmachines, boekingswidgets, interne apps.

Naar boven

10. Veelgemaakte fouten en valkuilen

10.1 "Het frame is leeg of zegt Refused to Connect"

Symptoom: De pagina laadt, je template verschijnt, maar het frame is leeg of toont een weigeringsmelding van de browser.

Oplossing: De doelsite stuurt X-Frame-Options of een frame-ancestors-beleid dat framen verbiedt. Controleer de response-headers van het doel. Je kunt dit niet omzeilen; ofwel de site moet jouw domein toestaan, ofwel je kunt hem niet verpakken.

10.2 "Auto Height doet niets"

Symptoom: Je hebt Auto Height aangezet, maar het frame houdt een vaste grootte en scrollt intern.

Oplossing: Auto Height werkt alleen voor same-origin-pagina's (sectie 5). Voor een extern domein blokkeert de browser de hoogtemeting. Stel in plaats daarvan een verstandige vaste hoogte in.

10.3 "Het frame heeft helemaal geen hoogte"

Symptoom: De verpakte pagina is onzichtbaar of maar een sliver hoog.

Oplossing: Een iframe heeft een expliciete hoogte nodig. Controleer of de height-waarde (standaard 500) is ingesteld en een aantal pixels is. Een hoogte van 100% werkt niet zonder een ouder-element met hoogte.

10.4 "Waarschuwing voor gemengde inhoud"

Symptoom: Een HTTPS-site verpakt een HTTP-URL en het frame wordt geblokkeerd.

Oplossing: Gebruik de https://-versie van de doel-URL. Laat Auto Add aanstaan zodat het huidige (veilige) schema wordt toegepast.

10.5 "De verpakte app blijft om inloggen vragen"

Symptoom: Je verpakt een externe applicatie die een login vereist, en die keert terug naar het inlogscherm, of de sessie valt weg, terwijl het in een eigen tabblad prima werkt.

Oplossing: Dit is de third-party cookie- / SameSite-beperking uit sectie 8.3, geen Joomla-bug. De geframede app moet zijn sessiecookie met SameSite=None; Secure instellen zodat de browser die binnen jouw frame meestuurt. Kun je de app niet aanpassen, host hem dan op je eigen domein of link ernaar in een nieuw tabblad in plaats van hem te verpakken.

10.6 "Mijn URL is veranderd na het opslaan"

Symptoom: Je typte example.com/x en het frame laadt https://example.com/x.

Oplossing: Dat is Auto Add (add_scheme) die het schema ervoor plaatst. Dit is normaal. Zet Auto Add alleen uit als je de URL echt onaangeroerd nodig hebt.

10.7 "Ik heb een pagina verpakt voor SEO"

Symptoom: Je verwachtte dat de geframede inhoud je rankings zou verbeteren.

Oplossing: Dat gebeurt niet. Geframede inhoud is in de ogen van een crawler niet van jou. Publiceer echte artikelen voor alles dat moet ranken (sectie 9).

Naar boven

11. Best practices

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

  • Gebruik de Wrapper voor tools en externe apps, nooit voor content die moet ranken in zoekmachines.
  • Verpak altijd HTTPS-URL's om mixed-content-blokkering te voorkomen.
  • Verwacht dat Auto Height alleen werkt voor pagina's op je eigen domein; stel anders een vaste hoogte in.
  • Controleer voordat je een site verpakt of die framen niet verbiedt met X-Frame-Options of frame-ancestors.
  • Stel een duidelijke Paginakop in - die wordt het toegankelijke title-attribuut van het iframe.
  • Voeg voor onbetrouwbare doelen een sandbox-attribuut toe via een template-override.
  • Heeft de verpakte app een login nodig, verwacht dan cross-domain-cookieproblemen tenzij die SameSite=None; Secure instelt.
  • Kies het juiste gereedschap: een volledige pagina gebruikt com_wrapper; een widget in de zijbalk gebruikt mod_wrapper.
Naar boven

12. In het kort

MAKEN        Menu's → Nieuw → Wrapper → Iframe Wrapper
URL          url          (verplicht; relatief of absoluut)
WIDTH        width        standaard 100%  (% schaalt, getal = px)
HEIGHT       height       standaard 500   (pixels; nodig om zichtbaar te zijn)
AUTO HEIGHT  height_auto  standaard 0 (Uit); ALLEEN SAME-ORIGIN
AUTO ADD     add_scheme   standaard 1 (Aan); plaatst http(s):// schema ervoor
LAZY LOAD    lazyloading  standaard lazy  (lazy | eager)
SCRIPT       media/com_wrapper/js/iframe-height.js  (+60px marge)
TABEL        geen eigen   (params in #__menu.params; reg in #__extensions)
LOGINS       cross-domain apps hebben SameSite=None; Secure cookies nodig
ROUTER       src/Service/Router.php  (altijd view=wrapper)
CACHE        controller forceert $cachable = true
OVERRIDE     templates/<tpl>/html/com_wrapper/wrapper/default.php
MODULE       mod_wrapper  (zelfde iframe, in een modulepositie)
GEBLOKKEERD  door X-Frame-Options / CSP frame-ancestors van het doel
API          geen         (geen Web Services / REST endpoints)
Naar boven

13. Samenvatting

De Wrapper is het kleinste core-component in Joomla, en het doet precies een ding: het zet een <iframe> op een pagina en wijst dat naar een URL.

Wat het waard maakt om te begrijpen:

  • Geen opslag: er is geen tabel, geen record, geen categorie. De menu-item-parameters zijn de hele configuratie.
  • URL herschrijven: Auto Add normaliseert stilletjes je URL en forceert meestal het huidige schema.
  • Auto Height: een handige JavaScript-resize die alleen werkt voor same-origin-pagina's.
  • Twee frontends: com_wrapper voor een volledige pagina, mod_wrapper voor een modulepositie, met een gedeeld script.
  • Beveiliging eerst: of een frame uberhaupt laadt, bepaalt de doelsite met zijn frame-headers, niet Joomla.
  • Zwak voor SEO: geframede inhoud telt nooit als de jouwe.

Zodra je ziet dat de Wrapper niets opslaat en simpelweg een URL aan de browser doorgeeft, valt elke eigenaardigheid op zijn plek - het herschreven schema, de stille Auto Height-mislukking, het lege "refused to connect"-frame.

Verpak je een oude tool, een extern boekingssysteem of een interne app en gedraagt het frame zich niet, dan zijn deze frame-headers en same-origin-regels meestal de oorzaak. Wordt een wrapper een hardnekkig integratieprobleem, dan loont het vaak om eerst te kijken hoe de twee sites met elkaar mogen praten voordat je Joomla de schuld geeft.

Naar boven
Wrapper in Joomla
Peter Martin
Peter Martin
Joomla Specialist

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