Few errors cause greater panic for website owners than ERR_TOO_MANY_REDIRECTS (also displayed in Firefox as “The page isn’t redirecting properly”). Instead of serving your website, the browser enters an infinite HTTP 301/302 redirection loop between server rules, eventually halting and displaying a blank error screen.
In this engineering guide, we walk through the four most common root causes of WordPress redirect loops and how to fix them permanently.
Cause 1: Cloudflare SSL Mode Mismatch (The #1 Culprit)
If your domain routes through Cloudflare’s proxy CDN and you encounter this loop after enabling SSL, your Cloudflare encryption mode is almost certainly set to “Flexible”:
- The Loop Mechanics: The visitor connects to Cloudflare over secure HTTPS. Cloudflare then contacts your origin server over unencrypted HTTP (port 80). If your WordPress server has an HTTPS redirect rule, it responds with a 301 redirect instructing the visitor to use HTTPS. Cloudflare receives this, repeats the request over HTTP, and triggers an infinite ping-pong loop.
- The Solution: In your Cloudflare dashboard, navigate to SSL/TLS > Overview. Change the encryption mode from Flexible to Full or Full (Strict).
Cause 2: WordPress Address and Site URL Mismatch
If your database has conflicting protocol entries for siteurl and home, WordPress will endlessly redirect between them. To hardcode and override database values, add these lines to your wp-config.php file directly above the line that says /* That’s all, stop editing! */:
define('WP_HOME', 'https://karakavuz.com');
define('WP_SITEURL', 'https://karakavuz.com');
Cause 3: Corrupted .htaccess Rewrite Rules (Apache / Litespeed)
Corrupted rewrite directives in .htaccess frequently trigger loops. Rename your existing .htaccess to .htaccess.bak via FTP/SSH, and create a fresh file with standard WordPress rules:
# BEGIN WordPress
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress




