2026年11月12日
2026年11月12日
Cloudflare dla WordPress: serwery nazw, SSL, prawdziwe IP i WAF
Ten artykuł jest zlokalizowaną wersją japońskiego oryginału. Przeczytaj japoński oryginał
Dodanie Cloudflare do WordPress przebiega w czterech krokach: ① dodajesz witrynę w Cloudflare i zmieniasz serwery nazw domeny, ② ustawiasz tryb szyfrowania SSL/TLS na Full (strict), ③ przywracasz po stronie serwera prawdziwy adres IP odwiedzających, ④ chronisz ekran logowania regułami niestandardowymi WAF. Nawet w darmowym planie dostajesz CDN, SSL, ochronę przed DDoS i reguły niestandardowe (do 5 sztuk).
W tym artykule omawiam każde z tych ustawień oraz rzeczy, które warto sprawdzić po przełączeniu. Nazwy i układ ekranów Cloudflare się zmieniają, dlatego opieram się tu na oficjalnej dokumentacji (developers.cloudflare.com) według stanu na listopad 2026.
Co ustalić przed rozpoczęciem pracy
- Zarządzanie DNS przenosisz do Cloudflare. Rejestrator domeny się nie zmienia, ale rekordy DNS edytujesz od teraz na ekranach Cloudflare.
- Rekordy DNS poczty (MX itp.) ustaw tak, aby nie przechodziły przez proxy. Cloudflare obsługuje tylko ruch WWW (HTTP/HTTPS).
- Sprawdź, czy origin (serwer, na którym stoi WordPress) ma ważny certyfikat SSL. Jeśli HTTPS działa np. dzięki Let's Encrypt, nie trzeba nic zmieniać.
- Jeśli u rejestratora masz włączony DNSSEC, wyłącz go przed zmianą serwerów nazw. Pozostały stary rekord DS powoduje błędy rozwiązywania nazw.
Krok 1: dodaj witrynę i zmień serwery nazw
- Załóż konto w Cloudflare i w panelu (Dashboard) dodaj domenę. Możesz wybrać plan Free.
- Cloudflare odczyta obecne rekordy DNS i wyświetli je na liście; sprawdź, czy niczego nie brakuje. Niektórych rekordów nie da się odczytać, więc porównaj listę z obecnym panelem DNS i brakujące rekordy dodaj ręcznie.
- Rekordy
A(lubAAAA,CNAME) witryny WWW ustaw ze statusem proxy włączonym (pomarańczowa chmurka). RekordyMXi rekordyAserwera poczty wyłącz (tylko DNS, szara chmurka). - Cloudflare pokaże dwie nazwy serwerów nazw. Mają postać
〇〇.ns.cloudflare.comi są przydzielane osobno do każdego konta. Użyj dwóch nazw z własnego ekranu, a nie tych, które widziałeś w innych artykułach. - W panelu rejestratora domeny zmień serwery nazw na te dwa.
Czy zmiana zadziałała, sprawdzisz poniższymi poleceniami. Propagacja może potrwać kilka godzin.
# Czy serwery nazw to dwa serwery Cloudflare
dig NS example.com +short
# Czy ruch przechodzi przez Cloudflare (zwracane są server: cloudflare i cf-ray)
curl -sI https://example.com | grep -iE '^(server|cf-ray):'
Gdy status domeny w Cloudflare zmieni się na aktywny (Active), przełączenie jest zakończone.
Krok 2: ustaw SSL/TLS na Full (strict)
W SSL/TLS w Cloudflare są tryby określające, jak szyfrowane jest połączenie między odwiedzającym a Cloudflare oraz między Cloudflare a originem.
| Tryb | Połączenie Cloudflare – origin | Zastosowanie w WordPress |
|---|---|---|
| Off | Bez szyfrowania | Nie używać |
| Flexible | HTTP (bez szyfrowania) | Nie używać. Powoduje pętle przekierowań i mieszaną zawartość |
| Full | HTTPS (certyfikat nie jest weryfikowany) | Rozwiązanie tymczasowe, dopóki nie przygotujesz certyfikatu |
| Full (strict) | HTTPS (certyfikat jest weryfikowany) | Wybierz ten |
Tryb zmieniasz na stronie przeglądu SSL/TLS (Overview) w panelu Cloudflare. Domyślna opcja „Automatic SSL/TLS" sama wybiera bezpieczny tryb w zakresie obsługiwanym przez origin. Jeśli sam wybierzesz Full (strict), nie ma ryzyka, że witryna zadziała w niezamierzonym trybie. Certyfikat originu może pochodzić z publicznego urzędu certyfikacji (np. Let's Encrypt) albo być certyfikatem Origin CA wystawianym przez Cloudflare.
Flexible należy omijać z następującego powodu. Przy Flexible do originu trafia HTTP, więc WordPress lub serwer odpowiada „przyszło przez HTTP, więc przekierowuję na HTTPS", a Cloudflare znów pobiera stronę z originu przez HTTP — i tak w kółko (przeglądarka pokazuje ERR_TOO_MANY_REDIRECTS). Przy Full (strict) do originu trafia też HTTPS, więc po stronie WordPress nie potrzeba dodatkowego kodu, który odczytuje X-Forwarded-Proto i nadpisuje $_SERVER['HTTPS'].
Upewnij się także, że w WordPress w „Ustawienia" → „Ogólne" (Settings → General) adresy „Adres WordPressa (URL)" i „Adres witryny (URL)" zaczynają się od https://. Jeśli obrazy itp. nadal ładują się przez http://, zobacz jak naprawić mieszaną zawartość.
Krok 3: przywróć prawdziwy adres IP odwiedzających
Gdy ruch idzie przez Cloudflare, źródłem połączenia (REMOTE_ADDR) widocznym dla serwera jest adres IP Cloudflare. W takim stanie logi dostępu, adresy IP komentarzy czy wtyczki ograniczające próby logowania traktują wszystkich odwiedzających jak adres IP Cloudflare. Cloudflare przekazuje IP odwiedzającego w nagłówku CF-Connecting-IP, więc skonfiguruj serwer tak, by ufał temu nagłówkowi tylko wtedy, gdy połączenie pochodzi z Cloudflare.
Jeśli nadpiszesz REMOTE_ADDR wartością z nagłówka bez sprawdzenia źródła połączenia, ktoś, kto obejdzie Cloudflare i wejdzie bezpośrednio na origin, może podać w nagłówku dowolny adres IP. Z tego powodu nie używaj kodu ze starych artykułów, który tylko podstawia HTTP_CF_CONNECTING_IP do REMOTE_ADDR, jeśli ten nagłówek istnieje.
Lista adresów IP Cloudflare jest publikowana pod adresem https://www.cloudflare.com/ips/. Lista się zmienia, więc przeglądaj ją regularnie.
Nginx
Użyj ngx_http_realip_module. W bloku http lub server wypisz wszystkie zakresy Cloudflare.
# Zakresy IP Cloudflare (stan na listopad 2026. Aktualne sprawdzisz na 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
Apache (Debian / Ubuntu)
Użyj mod_remoteip. Utwórz plik /etc/apache2/conf-available/remoteip.conf i wypisz zakresy Cloudflare w 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
Aby w logu dostępu zapisywać prawdziwe IP, w LogFormat (combined) w pliku /etc/apache2/apache2.conf zmień %h na %a.
Gdy nie możesz zmieniać konfiguracji serwera (wp-config.php)
Jeśli na hostingu współdzielonym nie możesz zmieniać konfiguracji serwera WWW, tę samą kontrolę wykonasz w wp-config.php. Umieść ją przed linią require_once ABSPATH . 'wp-settings.php';. Wartość CF-Connecting-IP (poprawny adres IP) jest używana tylko wtedy, gdy źródło połączenia mieści się w zakresach Cloudflare.
<?php
// Tylko przy ruchu przez Cloudflare używaj CF-Connecting-IP jako IP odwiedzającego
$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;
}
}
}
Plik wp-config.php ma <?php od początku, więc nie przepisuj <?php z pierwszej linii — wklej od drugiej linii. Przed wklejeniem zrób kopię zapasową wp-config.php.
Krok 4: chroń logowanie regułami niestandardowymi WAF
Reguły niestandardowe WAF w Cloudflare możesz w darmowym planie utworzyć do 5 sztuk i wybrać dla nich akcje inne niż Log (Block, Managed Challenge itp.). W panelu otwórz stronę Security rules, wybierz „Create rule" → „Custom rules", wskaż warunek (Field, Operator, Value) i akcję, a następnie kliknij „Deploy".
Przykład 1: otwórz logowanie i panel tylko dla własnego IP
To przykład dla sytuacji, gdy masz stały adres IP w domu lub firmie. Wyrażenie wygląda następująco (203.0.113.10 i 198.51.100.0/24 zastąp własnymi adresami IP).
(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}
Jako akcję wybierz Block. Plik /wp-admin/admin-ajax.php wyłączyłem z warunku, bo funkcje stron publicznych, takie jak formularze kontaktowe czy nieskończone przewijanie, mogą go wywoływać bez logowania.
Przykład 2: bez stałego IP zawęź według kraju i 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"}
Do rozpoznania kraju użyj ip.src.country (dwuliterowy kod ISO 3166-1). Używane w starych artykułach ip.geoip.country jest przestarzałe. Jako akcję ustaw na początek Managed Challenge, sprawdź w zdarzeniach bezpieczeństwa, czy nie zatrzymuje uprawnionego ruchu, i dopiero potem w razie potrzeby zmień na Block. Taką kolejność zaleca też dokumentacja Cloudflare. xmlrpc.php jest używany, gdy publikujesz przez Jetpack lub aplikację mobilną, więc dodaj go do warunku dopiero po sprawdzeniu, czy z niego korzystasz.
Ograniczenie według kraju to dodatkowa warstwa, którą da się obejść np. przez VPN. Połącz je z uwierzytelnianiem dwuskładnikowym i limitem prób logowania. Sposób rozpoznawania kraju po stronie Nginx opisuje artykuł Ograniczanie dostępu według kraju w Nginx przez GeoIP2.
Krok 5: domyślne zachowanie cache i purge przy publikacji
Cloudflare domyślnie nie zapisuje HTML w cache. Cache'uje pliki statyczne wybierane na podstawie rozszerzenia: obrazy, CSS, JavaScript, czcionki. Nie cache'uje też odpowiedzi zawierających nagłówek Set-Cookie. Dlatego bez dodatkowych ustawień panel administracyjny ani ekran logowania nie trafią do cache Cloudflare.
Jeśli chcesz cache'ować także HTML, rozszerz zakres w Cache Rules, ale wtedy trzeba wyłączyć z niego /wp-admin/, /wp-login.php, podglądy oraz widoki zalogowanych użytkowników. Błąd w tych wyłączeniach może sprawić, że ekrany administratora zobaczą inne osoby, więc jeśli nie masz pewności, lepiej zostawić ustawienia domyślne.
Jeśli po podmianie CSS lub obrazów wygląd się nie zmienia, wyczyść cache (purge) w ustawieniach cache w panelu. Jeśli chcesz czyścić cache automatycznie przy każdej publikacji lub aktualizacji wpisu, wywołaj API Cloudflare. Najpierw utwórz w Cloudflare token API z samym uprawnieniem „Cache Purge" i razem z identyfikatorem strefy (widocznym na stronie przeglądu domeny) zapisz go jako stałe w wp-config.php.
define( 'CF_ZONE_ID', 'identyfikator strefy' );
define( 'CF_API_TOKEN', 'token API' );
Poniższy kod umieść w functions.php motywu potomnego lub we własnej niewielkiej wtyczce (może być też np. Code Snippets).
<?php
// Po opublikowaniu lub zaktualizowaniu wpisu usuń z Cloudflare cache tego wpisu i strony głównej
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 uruchamia się zarówno przy publikacji wpisu, jak i przy aktualizacji wpisu już opublikowanego. W API purge_cache oprócz files, które wskazuje adresy URL, jest też purge_everything, czyszczące wszystko, ale pełny purge wymusza ponowne pobranie także plików statycznych, więc nie używaj go przy każdej publikacji artykułu.
Co sprawdzić po przełączeniu
- Wynik
curl -sIzawieraserver: cloudflareicf-ray, a w przeglądarce widać ikonę kłódki - Możesz zalogować się do panelu, zapisać wpis i wgrać plik do biblioteki mediów
- Nowe komentarze i logi dostępu rejestrują adres IP odwiedzającego, a nie adres IP Cloudflare
- Wiadomości z formularza kontaktowego dochodzą (rekord
MXnie przechodzi przez proxy) - Jeśli utworzyłeś reguły niestandardowe WAF, otwórz
wp-login.phpz połączenia, któremu nie zezwalasz (np. z sieci komórkowej telefonu) i sprawdź, czy pojawia się blokada lub challenge
Częste problemy
Pojawia się ERR_TOO_MANY_REDIRECTS
Sprawdź, czy tryb SSL/TLS nie jest ustawiony na Flexible. Zainstaluj certyfikat na originie i zmień tryb na Full (strict), a problem zniknie.
Nie możesz wejść do panelu administracyjnego
Możliwe, że warunki reguły niestandardowej WAF nie obejmują Twojego adresu IP lub kraju. Tymczasowo wyłącz regułę w panelu Cloudflare, w zdarzeniach bezpieczeństwa sprawdź, która reguła zablokowała dostęp, i dopiero wtedy popraw wyrażenie.
Cały ruch wygląda, jakby pochodził z jednego adresu IP
Przywrócenie prawdziwego IP z kroku 3 nie działa. W Nginx sprawdź zakresy w set_real_ip_from i real_ip_header, a w Apache — czy włączony jest remoteip.
Podsumowanie
- Serwery nazw przełącz na dwa przydzielone do Twojego konta, a rekordów poczty, takich jak
MX, nie przepuszczaj przez proxy - SSL/TLS ustaw na Full (strict). Flexible powoduje pętle przekierowań i mieszaną zawartość
- Prawdziwy adres IP przywracaj, ufając
CF-Connecting-IPtylko wtedy, gdy źródło połączenia mieści się w zakresach Cloudflare - Logowanie zawężaj regułami niestandardowymi WAF według IP lub kraju i na początek obserwuj działanie przez Managed Challenge
- HTML domyślnie nie jest cache'owany. Purge przy publikacji wykonuj tokenem API z samym uprawnieniem „Cache Purge"
Powiązane artykuły
- Jak skonfigurować DNS w Cloudflare
- Jak skonfigurować WAF w Cloudflare
- Ograniczanie dostępu według kraju w Nginx przez GeoIP2
- Jak naprawić mieszaną zawartość (Mixed Content)
Źródła: Restoring original visitor IPs (Cloudflare), Encryption modes (Cloudflare), Custom rules (Cloudflare WAF), Default cache behavior (Cloudflare)
Pytania o WordPress? Wydawca tej witryny ma siedzibę w Japonii i odpowiada po japońsku. Kontakt (po japońsku)