sfw/fix
Internal Redirect Loop high

Internal Redirect Loop (Crawler Report)

An internal URL redirects through a chain that loops back to an earlier hop, so the crawler flags a cycle and never reaches the page.

What you see

Screaming Frog → Response Codes
Redirect Loop: /products/widget
301 /products/widget → /products/widget/
301 /products/widget/ → /products/widget
Loop detected — final URL never reached

What’s actually happening

A site crawler — Screaming Frog, Sitebulb, Ahrefs — walks an internal URL through its redirects and lands back on a URL it already visited. It marks the URL as a loop and stops; the destination is never crawled or indexed. The browser version of this is ERR_TOO_MANY_REDIRECTS, but a crawler catches it even when one path happens to resolve, because it tracks every hop. Almost always two rules disagreeing: a server rewrite (.htaccess, Nginx) pushing one direction while the CMS canonical or another rule pushes back.

Common causes

  • Trailing-slash rules fight: the server strips the slash, then the CMS or a second rule re-adds it, so /page → /page/ → /page forever.
  • An .htaccess redirect and a WordPress/CMS canonical redirect target opposite URLs for the same page.
  • www→non-www (or http→https) handled by two rules whose order makes them undo each other.
  • A redirect map entry points old→new while another entry (or a wildcard) points new→old.
  • Case normalization: one rule lowercases the path, another rule or a stored link uppercases part of it.

How to fix it

  1. Print the full hop chaincurl -sIL https://example.com/products/widget shows every Location: header in order. Read down the list until you see a URL repeat — the two lines bracketing the repeat are the rules fighting. That's your loop, named exactly.
  2. Find the two rules and keep oneLoops are a pair, not a single bad rule. Check .htaccess / Nginx server block AND the CMS (WordPress Settings → Permalinks/Site URL, redirect plugins). Decide the one canonical form — say, https + non-www + trailing slash — and delete or rewrite whichever rule contradicts it.
  3. Consolidate slash and host handling into one ruleDo trailing-slash, www, and protocol in a single combined redirect to the final form, not three sequential ones that can ping-pong. One RewriteRule (or one Nginx return 301) that emits the canonical URL in one shot can't loop against itself.
  4. Align the CMS canonical with the serverMake the CMS Site/Home URL and any redirect-plugin target match the exact form the server enforces. If the server forces a trailing slash, the CMS must not redirect it away.
  5. Recrawl the single URL to confirmRe-run the crawler on just that URL (Screaming Frog: list mode). It should resolve in one or two hops to a 200 with no loop flag before you recrawl the whole site.

Stop it recurring

Keep all redirect logic in one layer (server OR CMS, not both) and recrawl after any .htaccess or permalink change.

Related errors