2026年11月12日
2026年11月12日
Cloudflare instellen voor WordPress: nameservers, SSL, echt IP, WAF
Dit artikel is een gelokaliseerde versie van het Japanse origineel. Lees het Japanse origineel
Cloudflare inrichten voor WordPress doe je in deze volgorde: (1) de site toevoegen aan Cloudflare en de nameservers van het domein wijzigen, (2) de SSL/TLS-versleutelingsmodus op Full (strict) zetten, (3) op de server het echte IP-adres van de bezoeker herstellen, en (4) de inlogpagina beschermen met een aangepaste WAF-regel. Ook met het gratis abonnement krijg je CDN, SSL, DDoS-bescherming en aangepaste regels (maximaal 5).
In dit artikel lees je elke instelling en wat je na het omschakelen controleert. De namen en indeling van de Cloudflare-schermen kunnen veranderen, daarom is dit geschreven volgens de officiële documentatie (developers.cloudflare.com) van november 2026.
Wat je vooraf moet weten
- Het DNS-beheer verhuist naar Cloudflare. Bij welke registrar je het domein hebt geregistreerd verandert niet, maar DNS-records bewerk je voortaan in het scherm van Cloudflare.
- Zet de DNS-records voor e-mail (zoals MX) op niet via de proxy. Alleen webverkeer (HTTP/HTTPS) loopt via Cloudflare.
- Controleer dat de origin (de server waarop WordPress staat) een geldig SSL-certificaat heeft. Werkt HTTPS al, bijvoorbeeld met Let's Encrypt, dan kun je dat zo laten.
- Heb je bij de registrar DNSSEC ingeschakeld, schakel dat dan uit voordat je de nameservers wijzigt. Blijft er een oud DS-record staan, dan mislukt de naamomzetting.
Stap 1: de site toevoegen en de nameservers wijzigen
- Maak een Cloudflare-account aan en voeg je domein toe in het dashboard. Je kunt het abonnement Free kiezen.
- Cloudflare leest je huidige DNS-records uit en toont ze in een lijst. Controleer of er niets ontbreekt. Sommige records kunnen niet worden uitgelezen, dus vergelijk de lijst met je huidige DNS-beheerscherm en voeg wat ontbreekt met de hand toe.
- Zet voor de
A-records (ofAAAAenCNAME) van je website de proxystatus aan (oranje wolk). ZetMXen deA-records voor de mailserver uit (alleen DNS, grijze wolk). - Cloudflare toont twee nameservernamen. Die hebben de vorm
〇〇.ns.cloudflare.comen worden per account toegewezen. Gebruik de twee namen die in jouw scherm staan, niet de namen uit andere artikelen. - Wijzig in het beheerscherm van de registrar van het domein de nameservers naar die twee.
Met de volgende opdrachten controleer je of de omschakeling is gelukt. Doorvoeren kan enkele uren duren.
# Zijn de nameservers de twee van Cloudflare?
dig NS example.com +short
# Loopt het verkeer via Cloudflare? (je krijgt server: cloudflare en cf-ray terug)
curl -sI https://example.com | grep -iE '^(server|cf-ray):'
Als de status van het domein in Cloudflare op actief (Active) staat, is het omschakelen klaar.
Stap 2: SSL/TLS op Full (strict) zetten
Cloudflare SSL/TLS heeft modi die bepalen hoe de verbinding tussen bezoeker en Cloudflare en tussen Cloudflare en de origin wordt versleuteld.
| Modus | Tussen Cloudflare en de origin | Gebruik bij WordPress |
|---|---|---|
| Off | Niet versleuteld | Niet gebruiken |
| Flexible | HTTP (niet versleuteld) | Niet gebruiken. Veroorzaakt redirectlussen en gemengde inhoud |
| Full | HTTPS (certificaat wordt niet gecontroleerd) | Tijdelijke oplossing tot je een certificaat hebt |
| Full (strict) | HTTPS (certificaat wordt gecontroleerd) | Kies deze |
Je wijzigt dit in het Cloudflare-dashboard op de pagina SSL/TLS Overview. De standaardinstelling "Automatic SSL/TLS" kiest automatisch een veilige modus binnen wat de origin ondersteunt. Kies je zelf Full (strict), dan draait het zeker niet in een onbedoelde modus. Als certificaat voor de origin kun je een certificaat van een openbare certificeringsinstantie gebruiken (zoals Let's Encrypt) of een Origin CA-certificaat dat Cloudflare uitgeeft.
Waarom je Flexible vermijdt: bij Flexible bereikt het verzoek de origin via HTTP. WordPress of de server antwoordt dan met "dit kwam binnen via HTTP, dus ik stuur door naar HTTPS", waarna Cloudflare opnieuw via HTTP bij de origin aanklopt, en zo gaat het rond (in de browser zie je ERR_TOO_MANY_REDIRECTS). Met Full (strict) komt het verzoek ook bij de origin via HTTPS binnen, dus je hebt in WordPress geen extra code nodig die op basis van X-Forwarded-Proto $_SERVER['HTTPS'] overschrijft.
Controleer daarnaast of "WordPress-adres (URL)" en "Siteadres (URL)" onder "Instellingen" → "Algemeen" (Settings → General; in de Japanse interface 設定 → 一般) met https:// beginnen. Staan afbeeldingen en dergelijke nog op http://, zie dan gemengde inhoud oplossen.
Stap 3: het echte IP-adres van de bezoeker herstellen
Loopt het verkeer via Cloudflare, dan is de verbindingsbron (REMOTE_ADDR) die de server ziet een IP-adres van Cloudflare. Zo blijven toegangslogs, IP-adressen bij reacties en plugins die inlogpogingen beperken alle bezoekers behandelen als een IP van Cloudflare. Cloudflare geeft het IP van de bezoeker door in de header CF-Connecting-IP, dus stel in dat die header alleen wordt vertrouwd als de verbindingsbron Cloudflare is.
Overschrijf je REMOTE_ADDR met de waarde van de header zonder de bron te controleren, dan kan iemand die rechtstreeks bij de origin binnenkomt, zonder Cloudflare, via de header elk gewenst IP opgeven. Gebruik daarom niet de code uit oude artikelen die alleen "als HTTP_CF_CONNECTING_IP bestaat, wijs dat toe aan REMOTE_ADDR" doet.
De lijst met IP-adressen van Cloudflare is openbaar op https://www.cloudflare.com/ips/. De lijst kan veranderen, dus bekijk hem regelmatig opnieuw.
Bij Nginx
Je gebruikt ngx_http_realip_module. Zet alle reeksen van Cloudflare in het http- of server-blok.
# IP-reeksen van Cloudflare (stand november 2026; de nieuwste staan op cloudflare.com/ips)
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
real_ip_header CF-Connecting-IP;
sudo nginx -t && sudo systemctl reload nginx
Bij Apache (Debian / Ubuntu)
Je gebruikt mod_remoteip. Maak /etc/apache2/conf-available/remoteip.conf aan en zet de reeksen van Cloudflare achter RemoteIPTrustedProxy.
RemoteIPHeader CF-Connecting-IP
RemoteIPTrustedProxy 173.245.48.0/20 103.21.244.0/22 103.22.200.0/22 103.31.4.0/22
RemoteIPTrustedProxy 141.101.64.0/18 108.162.192.0/18 190.93.240.0/20 188.114.96.0/20
RemoteIPTrustedProxy 197.234.240.0/22 198.41.128.0/17 162.158.0.0/15 104.16.0.0/13
RemoteIPTrustedProxy 104.24.0.0/14 172.64.0.0/13 131.0.72.0/22
RemoteIPTrustedProxy 2400:cb00::/32 2606:4700::/32 2803:f800::/32 2405:b500::/32
RemoteIPTrustedProxy 2405:8100::/32 2a06:98c0::/29 2c0f:f248::/32
sudo a2enmod remoteip
sudo a2enconf remoteip
sudo apache2ctl configtest
sudo systemctl restart apache2
Om het echte IP in het toegangslog te zetten, wijzig je in LogFormat (combined) in /etc/apache2/apache2.conf de %h in %a.
Als je de serverinstellingen niet kunt wijzigen (wp-config.php)
Kun je bij een shared hostingpakket de instellingen van de webserver niet aanpassen, dan doe je dezelfde controle in wp-config.php. Zet de code vóór de regel require_once ABSPATH . 'wp-settings.php';. Alleen als de verbindingsbron in een reeks van Cloudflare valt, wordt de waarde van CF-Connecting-IP gebruikt (als het een geldig IP-adres is).
<?php
// Gebruik CF-Connecting-IP alleen als IP van de bezoeker wanneer het verkeer via Cloudflare komt
$cf_ranges = [
'173.245.48.0/20', '103.21.244.0/22', '103.22.200.0/22', '103.31.4.0/22',
'141.101.64.0/18', '108.162.192.0/18', '190.93.240.0/20', '188.114.96.0/20',
'197.234.240.0/22', '198.41.128.0/17', '162.158.0.0/15', '104.16.0.0/13',
'104.24.0.0/14', '172.64.0.0/13', '131.0.72.0/22',
'2400:cb00::/32', '2606:4700::/32', '2803:f800::/32', '2405:b500::/32',
'2405:8100::/32', '2a06:98c0::/29', '2c0f:f248::/32',
];
function cf_ip_in_range(string $ip, string $cidr): bool
{
[$net, $bits] = explode('/', $cidr);
$ip_bin = inet_pton($ip);
$net_bin = inet_pton($net);
if ($ip_bin === false || $net_bin === false || strlen($ip_bin) !== strlen($net_bin)) {
return false;
}
$bits = (int) $bits;
$bytes = intdiv($bits, 8);
if ($bytes > 0 && substr($ip_bin, 0, $bytes) !== substr($net_bin, 0, $bytes)) {
return false;
}
$rest = $bits % 8;
if ($rest === 0) {
return true;
}
$mask = (0xFF << (8 - $rest)) & 0xFF;
return (ord($ip_bin[$bytes]) & $mask) === (ord($net_bin[$bytes]) & $mask);
}
if (!empty($_SERVER['HTTP_CF_CONNECTING_IP']) && !empty($_SERVER['REMOTE_ADDR'])) {
foreach ($cf_ranges as $range) {
if (cf_ip_in_range($_SERVER['REMOTE_ADDR'], $range)) {
$visitor = filter_var($_SERVER['HTTP_CF_CONNECTING_IP'], FILTER_VALIDATE_IP);
if ($visitor !== false) {
$_SERVER['REMOTE_ADDR'] = $visitor;
}
break;
}
}
}
In wp-config.php staat <?php al, dus neem de eerste regel <?php niet over en plak vanaf de tweede regel. Maak vóór het plakken een back-up van wp-config.php.
Stap 4: de inlogpagina beschermen met een aangepaste WAF-regel
Met het gratis abonnement kun je tot 5 aangepaste WAF-regels van Cloudflare maken en kun je andere acties dan Log kiezen (Block, Managed Challenge en dergelijke). Je maakt een regel op de pagina Security rules van het dashboard: kies bij "Create rule" voor "Custom rules", geef de voorwaarde (Field, Operator, Value) en de actie op en klik op "Deploy".
Voorbeeld 1: inlog en beheer alleen openstellen voor je eigen IP
Dit is een voorbeeld voor als je thuis of op kantoor een vast IP hebt. Als expressie ziet het er zo uit (vervang 203.0.113.10 en 198.51.100.0/24 door je eigen IP's).
(http.request.uri.path eq "/wp-login.php" or starts_with(http.request.uri.path, "/wp-admin/"))
and http.request.uri.path ne "/wp-admin/admin-ajax.php"
and not ip.src in {203.0.113.10 198.51.100.0/24}
Kies als actie Block. /wp-admin/admin-ajax.php wordt door functies van openbare pagina's, zoals contactformulieren en oneindig scrollen, soms zonder inloggen aangeroepen, en is daarom uit de voorwaarde gelaten.
Voorbeeld 2: zonder vast IP beperk je op land met Managed Challenge
(http.request.uri.path eq "/wp-login.php" or http.request.uri.path eq "/xmlrpc.php")
and not ip.src.country in {"JP"}
Voor het land gebruik je ip.src.country (tweeletterige ISO 3166-1-code). ip.geoip.country uit oude artikelen wordt afgeraden. Kies als actie eerst Managed Challenge, kijk in de beveiligingsgebeurtenissen of er geen legitiem verkeer wordt tegengehouden en zet hem zo nodig daarna op Block. Dat is ook wat de documentatie van Cloudflare aanraadt. xmlrpc.php wordt gebruikt als je berichten plaatst via Jetpack of een app op je smartphone, dus controleer eerst of je dat gebruikt voordat je het in de voorwaarde opneemt.
Beperken per land is een hulpmiddel dat je met een VPN en dergelijke kunt omzeilen. Combineer het met tweestapsverificatie en een limiet op inlogpogingen. Hoe je in Nginx het land bepaalt, lees je in Nginx: toegang per land beperken met GeoIP2.
Stap 5: standaardgedrag van de cache en legen bij publicatie
Cloudflare slaat standaard geen HTML op in de cache. Het cachet statische bestanden die op extensie worden herkend, zoals afbeeldingen, CSS, JavaScript en lettertypen. Ook antwoorden met een Set-Cookie-header worden niet gecachet. Als je niets instelt, worden het beheer en de inlogpagina dus nooit door Cloudflare gecachet.
Wil je ook HTML cachen, dan verbreed je het bereik met Cache Rules. Dan moet je /wp-admin/, /wp-login.php, voorbeeldweergaven en de weergave voor ingelogde gebruikers uitsluiten. Sluit je ze verkeerd uit, dan kunnen schermen voor beheerders aan anderen worden getoond. Als je er niet zeker van bent, laat je het dus het beste bij de standaardinstelling.
Als je CSS of afbeeldingen hebt vervangen maar de weergave niet verandert, leeg je (purge) de cache via de cache-instellingen in het dashboard. Wil je dat bij elke publicatie of wijziging van een bericht automatisch gebeuren, roep dan de API van Cloudflare aan. Maak in Cloudflare eerst een API-token met alleen het recht "Cache Purge" en zet dat samen met het zone-ID (te zien op de overzichtspagina van het domein) als constante in wp-config.php.
define( 'CF_ZONE_ID', 'JOUW-ZONE-ID' );
define( 'CF_API_TOKEN', 'JOUW-API-TOKEN' );
Zet de volgende code in de functions.php van een child-thema of in een eigen kleine plugin (Code Snippets werkt ook).
<?php
// Verwijder bij het publiceren of bijwerken van een bericht de cache van dat bericht en de homepage bij Cloudflare
function cf_purge_urls(array $urls): bool
{
if (!defined('CF_ZONE_ID') || !defined('CF_API_TOKEN')) {
return false;
}
$response = wp_remote_post(
'https://api.cloudflare.com/client/v4/zones/' . CF_ZONE_ID . '/purge_cache',
[
'headers' => [
'Authorization' => 'Bearer ' . CF_API_TOKEN,
'Content-Type' => 'application/json',
],
'body' => wp_json_encode(['files' => array_values($urls)]),
'timeout' => 15,
]
);
if (is_wp_error($response)) {
error_log('Cloudflare purge failed: ' . $response->get_error_message());
return false;
}
$result = json_decode(wp_remote_retrieve_body($response), true);
return !empty($result['success']);
}
add_action('publish_post', function (int $post_id): void {
if (wp_is_post_revision($post_id) || wp_is_post_autosave($post_id)) {
return;
}
cf_purge_urls([get_permalink($post_id), home_url('/')]);
});
publish_post wordt uitgevoerd wanneer een bericht wordt gepubliceerd en wanneer een al gepubliceerd bericht wordt bijgewerkt. Naast files, waarmee je URL's opgeeft, kent de API bij purge_cache ook purge_everything om alles te legen, maar dan moeten ook alle statische bestanden opnieuw worden opgehaald, dus gebruik je dat niet bij elke publicatie van een artikel.
Wat je controleert na het omschakelen
- In het resultaat van
curl -sIstaanserver: cloudflareencf-ray, en in de browser staat het slotje - Je kunt inloggen op het beheer, een bericht opslaan en media uploaden
- Nieuwe reacties en toegangslogs bevatten het IP van de bezoeker en niet een IP van Cloudflare
- E-mail uit het contactformulier komt aan (het
MX-record loopt niet via de proxy) - Als je een aangepaste WAF-regel hebt gemaakt: open
wp-login.phpvia een verbinding die je niet hebt toegestaan (bijvoorbeeld het mobiele netwerk van je smartphone) en controleer of je een blokkade of challenge krijgt
Veelvoorkomende problemen
ERR_TOO_MANY_REDIRECTS verschijnt
Controleer of de SSL/TLS-modus op Flexible staat. Installeer een certificaat op de origin en zet de modus op Full (strict), dan is het opgelost.
Je kunt niet meer in het beheer komen
Mogelijk valt je eigen IP of land niet binnen de voorwaarde van de aangepaste WAF-regel. Schakel de regel tijdelijk uit in het Cloudflare-dashboard, kijk in de beveiligingsgebeurtenissen welke regel je tegenhield en corrigeer dan de expressie.
Alle bezoeken lijken van hetzelfde IP te komen
Het herstellen van het echte IP uit stap 3 is niet gelukt. Controleer bij Nginx de reeksen van set_real_ip_from en real_ip_header, en bij Apache of remoteip is ingeschakeld.
Samenvatting
- Wijzig de nameservers naar de twee die aan je eigen account zijn toegewezen en laat records voor e-mail, zoals
MX, niet via de proxy lopen - Zet SSL/TLS op Full (strict). Flexible veroorzaakt redirectlussen en gemengde inhoud
- Herstel het echte IP alleen door
CF-Connecting-IPte vertrouwen als de verbindingsbron in een reeks van Cloudflare valt - Beperk de inlogpagina met een aangepaste WAF-regel op IP of land en begin met Managed Challenge om te zien hoe het uitpakt
- HTML wordt standaard niet gecachet. Leeg de cache bij publicatie met een API-token dat alleen het recht "Cache Purge" heeft
Gerelateerde artikelen
- Zo stel je de DNS van Cloudflare in
- Zo stel je de WAF van Cloudflare in
- Nginx: toegang per land beperken met GeoIP2
- Gemengde inhoud (Mixed Content) oplossen
Bronnen: Restoring original visitor IPs (Cloudflare), Encryption modes (Cloudflare), Custom rules (Cloudflare WAF), Default cache behavior (Cloudflare)
Vragen over WordPress? De uitgever van deze site zit in Japan en antwoordt in het Japans. Contact (Japans)