Cloudflare Settings for WordPress: My Exact Free Plan Setup

Some links on WebPickr are affiliate links. If you buy through them, we may earn a commission at no extra cost to you. Read our affiliate disclosure.

These are the exact Cloudflare settings for WordPress that I use on WebPickr, on the free plan. The site runs on my own VPS with aaPanel and Nginx, and FlyingPress handles caching and optimization. Every screenshot in this guide comes from my own Cloudflare dashboard.

Most Cloudflare guides list every toggle and tell you to turn it on. That is how people end up with Rocket Loader fighting their cache plugin, or with a contact email that shows up as “[email protected]”. I will show what I turned on, what I left off, and the one setting I found broken on my own site while writing this.

Quick summary

  • SSL is on Full (strict) with a free Let’s Encrypt certificate on the server, and the minimum TLS version is 1.2.
  • Rocket Loader stays off. FlyingPress already delays and defers JavaScript.
  • FlyingPress creates the Cloudflare cache rules itself, so full pages are cached at the edge on the free plan. My homepage returns cf-cache-status: HIT.
  • Smart Tiered Cache is on. It is free and sends fewer requests to the server.
  • Email Address Obfuscation is off. It was replacing my email address in 7 places in one guide.
  • AI training crawlers are blocked. Search engines and AI search bots are allowed.

My Results: Pages Served From Cloudflare, Not the Server

Before going through the settings, here is the test that shows they work. I requested the homepage twice from Windows Command Prompt with curl -sI https://webpickr.com/. This only reads the response headers and changes nothing on the site.

The first request returned cf-cache-status: MISS. Cloudflare’s Dhaka data center did not have the page yet, so it fetched it from my server and stored it. The second request returned HIT with Age: 324. The page had been sitting in Cloudflare’s cache for 324 seconds, and my server was not involved at all.

curl headers showing cf-cache-status HIT for a WordPress page cached at Cloudflare

These are the headers that matter:

HeaderWhat it means
cf-cache-status: HITCloudflare served the page from its own cache
Age: 324How many seconds the page has been in Cloudflare’s cache
cdn-cache-control: max-age=2592000FlyingPress tells Cloudflare it can keep the page for 30 days. A purge removes it right away
Cache-Control: no-cache, must-revalidateBrowsers must check for a fresh copy, so visitors see updates right after a purge
x-flying-press-cache: HITWhen the server is asked, FlyingPress serves a ready page instead of building it in WordPress

The Setup Behind These Settings

  • Cloudflare plan: Free
  • Server: my own VPS with aaPanel and Nginx
  • Theme: Kadence (free)
  • Cache and optimization: FlyingPress with its Cloudflare page caching integration (my FlyingPress settings)
  • Email: Cloudflare Email Routing for receiving, Brevo for sending

I have bought domains from Namecheap, Spaceship, NameSilo and DreamHost, and moving them to Cloudflare works the same way everywhere. Add the site in Cloudflare, copy the two nameservers it gives you, and paste them in your registrar’s nameserver settings. The registrar does not change anything in this guide.

If you use a different cache plugin, or none, most of this still applies. Only the caching section depends on FlyingPress, and it includes the options for other setups.

DNS: Proxy Only What Serves the Website

The orange cloud (Proxied) sends traffic through Cloudflare. The grey cloud (DNS only) points straight to the target. Only the records that serve web pages should be orange.

RecordProxy statusWhy
A record for the root domainProxiedThis is the website. Without the orange cloud there is no caching, SSL at the edge or protection
CNAME for wwwProxiedVisitors who type www also go through Cloudflare
MX and email TXT recordsDNS onlyMail records cannot be proxied
Brevo DKIM CNAMEsDNS onlyEmail providers must see the real values to verify the domain
Cloudflare DNS records with the website proxied and email records set to DNS only

Never share a screenshot that shows your server IP. If someone knows it, they can send traffic straight to the server and skip Cloudflare’s protection.

SSL/TLS: Full (strict), Not Flexible

Flexible mode encrypts traffic only between the visitor and Cloudflare. The connection from Cloudflare to your server stays plain HTTP. Full (strict) encrypts both sides and checks that the server’s certificate is valid. Cloudflare itself strongly recommends Full or Full (strict).

I have run sites on Cloudflare for years, and many of my older ones were never on Full (strict). On WebPickr I issued a free Let’s Encrypt certificate in aaPanel first, then switched to Full (strict). It worked on the first try with no errors. The only condition is that the certificate on the server must stay valid. If it expires, Cloudflare shows Error 526 instead of your site, so make sure your panel renews it automatically.

Cloudflare SSL/TLS encryption mode set to Full strict for a WordPress site

These are my settings under SSL/TLS > Edge Certificates:

SettingMy valueWhy
Always Use HTTPSOnEvery HTTP request is redirected to HTTPS at Cloudflare
Minimum TLS VersionTLS 1.2The default is TLS 1.0. My traffic report showed visitors only on TLS 1.2 and 1.3, so raising it blocked nobody
TLS 1.3OnFaster and more secure connections
Automatic HTTPS RewritesOnFixes old http:// links to images or files
Opportunistic EncryptionOnDefault, harmless
HSTSOff in CloudflareMy server already sends an HSTS header, so enabling it here would add nothing
Cloudflare minimum TLS version set to TLS 1.2 with TLS 1.3 enabled

Be careful with HSTS if your server does not send it yet. Once a browser sees it, it refuses plain HTTP for the whole max-age period, often a year. Turn it on only when you are sure HTTPS will always work.

Speed Settings: What I Turned On and What I Left Off

Go to Speed > Settings. On the free plan, the most important decision here is what to leave off, because a cache plugin already does part of this work.

SettingMy valueWhy
Rocket LoaderOffIf your cache plugin already delays or defers JavaScript, keep it off. FlyingPress does this on my site, and FlyingPress’s own Cloudflare docs say Rocket Loader may conflict with its script optimization
HTTP/2, HTTP/3, 0-RTTOnFaster connections, no downside
HTTP/2 to OriginOnNginx on my server supports it
Early HintsOnLets browsers start loading key files earlier when the server sends preload hints. Free and harmless
Speed BrainOnPrefetches the next page only from Cloudflare’s cache, never from the server
Cloudflare FontsOffFlyingPress already handles fonts on my site
Web Analytics (RUM)OffAdds a separate Cloudflare script to every page. I will choose one analytics tool later instead of running two
Polish (image compression)Not availablePro plan only. FlyingPress converts my images to WebP instead
APONot usedPaid add-on. The FlyingPress integration caches full pages for free, and FlyingPress says APO should be off when you use it
Cloudflare speed settings with Rocket Loader off and Early Hints and Speed Brain on

What about Auto Minify?

You will not find it anymore. Cloudflare removed Auto Minify on August 5, 2024, and many older guides still tell you to turn it on. Your cache plugin should minify CSS and JavaScript instead.

Speed Brain and FlyingPress together

FlyingPress also prefetches pages when a visitor hovers over a link, using the same browser feature. I kept both on, because Speed Brain only serves pages that are already in Cloudflare’s cache and never sends extra requests to the server. I have seen one 2024 report of Speed Brain breaking plugin updates while it was in beta. If WordPress admin tasks start failing for no reason, Speed Brain is the first thing I would switch off.

Caching: Let FlyingPress Create the Rules

By default, Cloudflare caches only static files like images, CSS and JavaScript. HTML pages still come from your server. The FlyingPress integration fixes that on the free plan. You add your Cloudflare Zone ID, email and Global API Key in FlyingPress > CDN, turn on page caching, and FlyingPress creates the cache rules in your Cloudflare account.

Do not create your own HTML cache rule next to it. FlyingPress keeps its rules in sync with its own exclusions, and when you update a post it purges only the HTML pages, so images and CSS stay cached.

Cache rules created by FlyingPress in Cloudflare for pages and static files

The two rules FlyingPress creates

RuleMatchesEdge TTLBrowser TTL
FlyingPress cache pageEvery URL on the domain, except when the wordpress_logged_in cookie is presentUse the cache-control header, bypass if there is noneRespect origin TTL
FlyingPress cache static filesFiles like CSS, JS, images, fonts, PDF and ZIP1 year1 year

The page rule is the clever part. Logged-in users always bypass the cache, so nothing from your admin view ends up in front of visitors. Pages that FlyingPress does not cache, like the login page, do not get its CDN cache header, so Cloudflare skips them too. Because the browser TTL respects the server’s no-cache header, visitors see a new version right after you purge.

The static rule caches files for a year. That is safe because changed CSS and JavaScript files get a new file name or version number, and WordPress gives new uploads their own file names. The page rule also has Cache by device type turned on, because Separate Mobile Cache is enabled in my FlyingPress settings.

FlyingPress cache page rule in Cloudflare with edge TTL from cache-control and browser TTL respecting origin

Not using FlyingPress?

Without a page caching integration, Cloudflare still caches your images, CSS and JavaScript, which already helps. To cache full HTML pages on the free plan, you need something that also clears Cloudflare’s cache when you update a post:

  • Your cache plugin’s Cloudflare integration, if it can cache pages at the edge and not only purge them. Check its documentation.
  • Super Page Cache, a free plugin by Optimole that caches pages at Cloudflare with cache rules and purges them when content changes. I have not used it on this site.
  • Cloudflare APO, a paid add-on of $5 a month on the free plan. It needs the official Cloudflare WordPress plugin.

Do not add a manual “cache everything” rule without automatic purging. Visitors would keep seeing the old version of a post after you update it, until you purge Cloudflare by hand.

Other caching settings

SettingMy valueWhy
Caching LevelStandardThe default, works with the rules above
Browser Cache TTL4 hours (default)Left alone. The FlyingPress rules set their own browser TTL, so this value does not affect my pages or files
Tiered CacheSmart Tiered CacheFree. When one Cloudflare data center does not have a page, it asks another Cloudflare data center before asking my server
Crawler HintsOffIt sends IndexNow pings. Rank Math’s Instant Indexing will do that job on my site
Always OnlineOffIt shares site data with the Internet Archive and shows only limited old copies when the server is down
Development ModeOffTurn it on only while testing changes. It bypasses the cache
Smart Tiered Cache enabled in Cloudflare on the free plan

If you use cloaked affiliate links, this matters. A cached redirect could send visitors to an old target or skip your click tracking. I tested one of my Pretty Links with curl -sI https://webpickr.com/go/rankmath. It returned cf-cache-status: BYPASS and Cache-Control: no-store, so every click reaches the server and gets counted. No extra rule was needed.

Pretty Links affiliate redirect showing cf-cache-status BYPASS on Cloudflare

Security Settings on the Free Plan

Go to Security > Settings. The free plan already includes DDoS protection and a free managed ruleset that are always on. These are the settings I changed or checked:

SettingMy valueWhy
Bot Fight ModeOnChallenges automated traffic. I checked it does not block my own server (see below)
Browser Integrity CheckOnBlocks requests with suspicious browser headers
Email Address ObfuscationOffIt was breaking email addresses in my content (see below)
Replace insecure JavaScript librariesOnFree, automatic
Hotlink ProtectionOffNot needed for my site
Custom rules and rate limitingNone yetI use two-factor login on WordPress instead (see below)
Cloudflare security settings with Bot Fight Mode turned on for a WordPress site

Bot Fight Mode: check your own server first

Bot Fight Mode on the free plan has one big limit. Cloudflare’s documentation says you cannot skip it with WAF custom rules. If it starts challenging something you need, your only real choice is to turn it off.

The risk on WordPress is your own server. WordPress sends some requests back to its own address, such as loopback checks. With Cloudflare in front, those requests go through Cloudflare too. To check, open Tools > Site Health in WordPress. On my site there was no loopback or REST API error, so Bot Fight Mode is not blocking the server and it stays on. I also checked Security Events: the blocks there were managed-rule blocks, mostly Meta’s AI crawler, and none came from Bot Fight Mode.

Why I turned off Email Address Obfuscation

This setting is on by default. It hides email addresses from spam bots by replacing them in the HTML and adding a small script that shows the real address in the browser. Normal visitors see the correct email. Anything that reads the page without running JavaScript sees “[email protected]” instead.

While checking my Cloudflare Email Routing guide as plain text, I found the address replaced in 7 places, including the settings tables. On a guide about setting up an email address, the address is the content, and AI answer tools would quote it broken. I turned the setting off, purged the cache, and checked again: zero replacements. If your site does not show example email addresses, leaving it on is fine.

Rate limiting and custom rules on the free plan

The free plan gives you 5 custom rules and 1 rate limiting rule. The rate limiting rule is weak: it counts requests over 10 seconds, can match only by path, and blocks for just 10 seconds. A slow brute-force bot passes under it. Instead of spending it on wp-login.php, I chose two-factor authentication on the WordPress login, which stops password guessing no matter how slowly the bot tries. A common free custom rule is blocking /xmlrpc.php, which is safe if you do not use Jetpack or the WordPress mobile app.

Cloudflare’s AI Crawl Control page lists every AI bot that visits your site and lets you block each one, even on the free plan. My rule is simple. Bots that collect content to train AI models are blocked. Bots that fetch a page to answer someone’s question, and can link back to the site, are allowed.

TypeExamplesMy choice
Search enginesGooglebot, BingBot, ApplebotAllowed
AI search and assistantsOAI-SearchBot, ChatGPT-User, Claude-SearchBot, PerplexityBot, Perplexity-UserAllowed
AI trainingGPTBot, ClaudeBot, CCBot, Bytespider, Meta-ExternalAgentBlocked

In the last 7 days, Googlebot made 104 allowed requests. GPTBot was blocked 7 times and Meta-ExternalAgent 18 times. I also turned on Bot Preference Sync, which adds Cloudflare’s AI rules to the top of my robots.txt.

Cloudflare AI Crawl Control blocking AI training crawlers while allowing Googlebot

Some toggles cannot be changed, like Claude-User on my list. Since July 2026, Cloudflare groups AI bots into Search, Agent and Training, and its default policy blocks Training and Agent bots only on pages that show ads. My site has no ads, so Claude-User still got through (20 allowed, 0 blocked). If you add display ads later, review this policy under Configure AI bot policies.

Blocking Meta’s AI crawler does not break Facebook link previews. Previews come from a different bot that is not on this list.

Quick Checklist: My Cloudflare Settings for WordPress

SectionSettingMy value
DNSWebsite records (A, www)Proxied
DNSMail and DKIM recordsDNS only
SSL/TLSEncryption modeFull (strict)
SSL/TLSAlways Use HTTPSOn
SSL/TLSMinimum TLS VersionTLS 1.2
SSL/TLSTLS 1.3, Automatic HTTPS RewritesOn
SSL/TLSHSTSOff (server sends it)
SpeedRocket LoaderOff
SpeedHTTP/3, 0-RTT, Early Hints, Speed BrainOn
SpeedCloudflare Fonts, Web Analytics (RUM)Off
CachingCache rulesCreated by FlyingPress only
CachingTiered CacheSmart Tiered Cache
CachingCaching Level, Browser Cache TTLStandard, 4 hours (default)
CachingCrawler Hints, Always OnlineOff
SecurityBot Fight Mode, Browser Integrity CheckOn
SecurityEmail Address ObfuscationOff
SecurityCustom and rate limiting rulesNone (2FA on login)
AI Crawl ControlTraining crawlersBlocked
AI Crawl ControlSearch and assistant crawlersAllowed
AI Crawl ControlBot Preference SyncOn

After changing settings, purge the cache once (FlyingPress > Purge Entire Cache also purges Cloudflare). Then run curl -sI on your homepage twice and look for cf-cache-status: HIT on the second run.

FAQ

Is the Cloudflare free plan enough for a WordPress site?

For a blog or affiliate site, yes. With a cache plugin that supports Cloudflare page caching, the free plan serves full pages from the edge. You also get free SSL, DDoS protection and bot controls. Image compression with Polish and the larger WAF rule sets need a paid plan.

Should I use Flexible or Full (strict) SSL?

Full (strict), as long as your server has a valid certificate. A free Let’s Encrypt certificate or a Cloudflare Origin Certificate both work. Flexible leaves the connection between Cloudflare and your server unencrypted.

Should I turn on Rocket Loader with a cache plugin?

Not if your cache plugin already delays or defers JavaScript. FlyingPress recommends keeping Rocket Loader off because the two can conflict.

Do I need Cloudflare APO for WordPress?

Not if your cache plugin can cache full pages at Cloudflare, like FlyingPress does on my site. APO costs $5 a month on the free plan and needs the official Cloudflare plugin. FlyingPress asks you to keep APO off when you use its integration.

Will blocking AI training bots hurt my Google rankings?

No. Googlebot is a search crawler, not an AI training crawler, and it stays allowed. On my site it made 104 allowed requests in the same week that GPTBot and Meta’s AI crawler were blocked.

Here is how I set up Redis object cache on aaPanel for several WordPress sites on one VPS. If you have not set up FlyingPress yet, start with my FlyingPress settings, since the caching part of this guide depends on it.

Related Guides