← Terug naar kennisbank HOSTING

403 Forbidden — wat het betekent en hoe je 'm oplost

Je opent je site en ziet alleen "403 Forbidden — You don't have permission to access this resource." De server begrijpt je verzoek perfect, en weigert het bewust. Anders dan een 404 (pagina niet gevonden) of 500 (er ging iets mis) is een 403 een actieve afwijzing. Dit artikel loopt de zes meest voorkomende oorzaken door, met diagnose en concrete fixes per scenario.

De varianten:

  • 403 Forbidden
  • HTTP Error 403
  • 403 — Forbidden: Access is denied
  • "You don't have permission to access this resource"
  • "Access Denied — You are not authorized to access this site"
  • "Forbidden: You don't have permission to access [URL] on this server"
  • Cloudflare-pagina met "Error 1010" / "Error 1015" (rate limiting / WAF)

Wat betekent een 403?

Op HTTP-niveau zegt een 403: "De server kan jouw verzoek lezen, vindt 't begrijpelijk, maar weigert toegang." Drie dingen om uit te halen:

  • De pagina/resource bestaat waarschijnlijk wel (anders 404)
  • De server functioneert wel (anders 500)
  • Iets — file permissions, een server-rule, een firewall — zegt expliciet "geen toegang"

Onderscheid met buurman-codes:

  • 401 Unauthorized — login vereist, jij bent niet ingelogd
  • 403 Forbidden — toegang sowieso geweigerd, ook met login niet meer
  • 404 Not Found — bestand/pagina bestaat niet
  • 500 Internal Server Error — server-fout. Zie 500 Internal Server Error oplossen
  • 503 Service Unavailable — tijdelijk niet beschikbaar (overload). Zie 503 Service Unavailable oplossen

Stap 1: identificeer het type 403

Twee belangrijke vragen:

  • Hele site of één pagina? — site-breed wijst naar permissies of .htaccess; specifieke pagina vaak hotlink-protectie of WAF
  • Voor iedereen of alleen sommige bezoekers? — voor jou wel maar bezoekers niet wijst op IP-block of geo-restrictie
  • Welke browser-output? — Cloudflare-fout met Ray ID is iets anders dan Apache-default 403 of een aangepaste hosting-foutpagina

De zes meest voorkomende oorzaken

1. Verkeerde file permissions

Op Linux-hosting moeten bestanden en mappen specifieke permissies hebben — anders weigert Apache/Nginx ze te serveren.

Wat correct is:

  • Mappen: 755 (drwxr-xr-x)
  • PHP-bestanden: 644 (rw-r--r--)
  • Configuratie-bestanden zoals wp-config.php: 600 of 640
  • NIET: 777 (te ruim, wordt soms door hosting geweigerd) of 600 op normale pagina-bestanden (dan kan webserver ze niet lezen)

Diagnose: via SSH

# Check permissies
ls -la /home/jouwsite/public_html/

# Bestanden met afwijkende permissies
find . -type f ! -perm 644 -ls | head -20
find . -type d ! -perm 755 -ls | head -20

Fix:

cd /home/jouwsite/public_html
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
chmod 600 wp-config.php  # extra strict voor config

Veroorzaakt vaak ook 500-fouten als de permissies te krap of te ruim staan — soms zie je dus een mix van 403 en 500.

2. .htaccess deny-rule of corruptie

Een .htaccess-bestand kan toegang per pad of per criterium expliciet weigeren. Verkeerd geconfigureerd of corrupt en de hele site (of een directory) is afgesloten.

Voorbeelden van rules die 403 veroorzaken:

# Blokkeer toegang voor IP-range
Deny from 1.2.3.0/24

# Apache 2.4 syntax
<RequireAll>
    Require not ip 1.2.3.0/24
</RequireAll>

# Geen directory listing
Options -Indexes

# Block specifieke files
<Files "wp-config.php">
    Require all denied
</Files>

Diagnose: hernoem .htaccess tijdelijk naar .htaccess.bak. Werkt site weer? Probleem zat in htaccess. Voeg regels één voor één terug om te isoleren welke.

Voor WordPress: schone default .htaccess:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Zie ook .htaccess uitgelegd.

3. Index-bestand ontbreekt

Wanneer iemand https://jouwsite.nl/ opent, zoekt Apache naar index.html, index.php of een andere geconfigureerde index file. Als die ontbreekt en directory listing uit staat: 403.

Bij WordPress zou er index.php in webroot moeten staan. Ontbreekt die? Re-install WordPress core via WP-CLI:

wp core download --force

Of upload index.php via FTP vanuit een schone WP-zip.

4. ModSecurity / WAF blokkeert

Op shared hosting met ModSecurity actief: bepaalde requests die op een aanval lijken (formulier-submits met SQL-achtige tekens, file-uploads met verdachte content, REST API-calls) worden geweigerd met 403. Vaak in error_log: ModSecurity: Access denied with code 403.

Symptoom: 403 alleen op specifieke acties (form-submit, plugin-install, file-upload). Site werkt verder normaal.

Fix: hosting support contacten, vraag om die specifieke ModSecurity-rule uit te schakelen voor jouw site of voor die URL. Niet zelf in code workarounds proberen — zit op server-niveau, niet in WordPress.

5. Hotlink-protection actief

Hotlink-protection blokkeert dat externe sites jouw afbeeldingen direct embedden. Werkt door de Referer-header te checken: requests met andere referer dan jouw eigen domein → 403 op de afbeelding.

Soms te streng ingesteld, dan zien jouw eigen bezoekers ook 403's op afbeeldingen — bijvoorbeeld bij requests zonder referer of vanuit andere subdomeinen.

Diagnose: open een afbeelding-URL direct in incognito; geeft 'ie 403 maar werkt 'ie wel embed in de site? Hotlink-protection.

Fix: in .htaccess hotlink-protection vinden en aanpassen of weghalen. Voorbeeld-regels die je zoekt:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?jouwsite\.nl [NC]
RewriteRule \.(jpg|jpeg|png|gif|webp)$ - [F]

Of in cPanel: "Hotlink Protection" — controleer instellingen, voeg subdomeinen toe of zet uit.

6. Hosting-niveau IP-block of geo-block

Hosting heeft jouw IP geblokkeerd na verdacht gedrag (bijv. te veel mislukte login-pogingen) of er staat een geo-restrictie op die landen weigert. Bij Cloudflare:

  • Error 1006 / 1007 / 1008: IP/ASN/Land geblokkeerd
  • Error 1010: bezoeker's browser-fingerprint geweigerd
  • Error 1015: rate limited
  • Error 1020: Access Rule geblokkeerd

Diagnose: test vanaf een ander netwerk (mobiele 4G, VPN). Werkt 't vanaf elders wel? Dan is jouw IP geblokkeerd. In Cloudflare zie je in Security Events welke regel je trigger.

Fix:

  • Hosting-firewall / fail2ban: log in via SSH/paneel en whitelist je eigen IP
  • Cloudflare: Security → WAF → Tools → IP Access Rules — controleer en pas aan
  • Bij vermoeden van false positive: contact Cloudflare/hoster

Specifieke scenario's

403 op /wp-admin/ of /wp-login.php

Inloggen niet meer mogelijk — vrijwel altijd een security-plugin (Wordfence, iThemes Security) die een IP heeft geblokkeerd na mislukte logins. Of een handmatige .htaccess-rule:

<Files wp-login.php>
    Require ip 1.2.3.4
</Files>

Fix:

  • Via FTP: hernoem de security-plugin's map om 'm tijdelijk uit te zetten
  • Via database: in wp_options de plugin-block-list zoeken (vaak in itsec_* of wordfence_* rijen)
  • .htaccess regel verwijderen of jouw IP toevoegen

403 op /xmlrpc.php

XML-RPC wordt vaak bewust geblokkeerd via .htaccess als security-maatregel — het is een populair brute-force-doel. Dit is meestal correct gedrag, geen probleem. Alleen als je een externe app gebruikt die XML-RPC nodig heeft (oudere mobiele app, Jetpack zonder REST API), moet je 'm openzetten.

403 op uploads-folder

WordPress' wp-content/uploads/ moet leesbaar zijn voor bezoekers (afbeeldingen). 403 hier wijst op:

  • Verkeerde permissies op de uploads-map (moet 755)
  • .htaccess in uploads-map die te streng blokkeert (vaak na een security-plugin install)
  • Open Directory listing geweigerd terwijl er geen index-file is — meestal gewenst gedrag, niet probleem behalve als je naar een directory navigeert

403 alleen op specifieke admin-acties

Plugin-installatie, theme-upload, of bulk-update geeft 403 — bijna altijd ModSecurity die de POST-request afkeurt. Hosting-side rule uitschakelen.

403 sinds een security-plugin install

De plugin heeft regels toegevoegd die te streng zijn, of jouw eigen IP in de block-list gezet. Plugin via FTP deactiveren door map te hernoemen, dan voorzichtiger configureren.

Snelle diagnose-checklist

  1. Hele site of specifieke URL? Voor iedereen of alleen jou?
  2. Zou je dezelfde URL via een ander netwerk (4G, VPN) wél kunnen bereiken? IP-block waarschijnlijk
  3. Open server error_log, zoek ModSecurity, permission denied, client denied
  4. Hernoem .htaccess naar .htaccess.bak — werkt site weer? Het zat in htaccess
  5. Check file permissions (755 voor mappen, 644 voor files)
  6. Recent een security-plugin geïnstalleerd? Vaak deze de boosdoener
  7. Cloudflare aan? Check Security Events op recent geblokkeerde requests
  8. Hosting paneel hotlink-protection of IP-block actief?
Tip: de tekst onder de 403-melding is vaak meer informatief dan de standaardtekst. Apache toont soms "Permission denied: configuration error: couldn't perform authentication" of "Forbidden: You don't have permission to access /wp-admin/options.php on this server". Lees die uitbreiding — daar staat vaak in welk pad of welke check faalde.

Wanneer schakel je hulp in?

  • Je bent uit wp-admin geblokkeerd door een security-plugin en weet niet hoe je 't terug deactiveert zonder paniek
  • 403 alleen voor sommige bezoekers — geo-block of WAF-rule met false positives die je niet identificeert
  • Hosting wijst naar ModSecurity, jij wilt regelspecifiek uitzetten zonder al te veel security te verlagen
  • Hotlink-protection blokkeert je eigen valide bezoekers en je weet niet welke regel het is
  • 403 in combinatie met andere errors (500, 502) — meerdere oorzaken tegelijk vragen geconsolideerde diagnose
  • WooCommerce-shop, betaal-callback geeft 403 — orders gaan stuk
  • 403 op /wp-login.php en je hebt geen FTP-toegang — vraagt om hosting-side hulp

Een 403 is in 80% van de gevallen op te lossen met "fix file permissions, vervang htaccess, deactiveer security-plugin." Met de stappen hierboven vind je dat snel. De resterende 20% — Cloudflare-config, ModSecurity-tuning, hostingblock — vraagt vaak hosting-side toegang die je zelf niet hebt. Dan is 't makkelijker een derde te vragen die wel ervaring heeft met die kant.