ERR_TOO_MANY_REDIRECTS on Nginx

A 'return 301 https://$host$request_uri' block inside the HTTPS server block sends HTTPS traffic back to itself, producing an infinite loop behind a TLS-terminating proxy.

Why it happens on Nginx

A 'return 301 https://$host$request_uri' block inside the HTTPS server block sends HTTPS traffic back to itself, producing an infinite loop behind a TLS-terminating proxy.

The fix on Nginx

Keep the redirect only in the port 80 server block, and behind a proxy redirect on $http_x_forwarded_proto = http rather than on the port.

If that didn't fix it

Nginx has its own failure mode, but ERR_TOO_MANY_REDIRECTS has a wider set of causes. The most common one overall is: The CDN forwards to the origin over HTTP while the origin redirects all HTTP to HTTPS — an infinite loop.

Switch the CDN's SSL mode to Full so the origin leg is encrypted, or make the origin trust the forwarded-proto header instead of the raw scheme.

Check your own domain

The uptime probe returns the full redirect chain, so you can see the exact two URLs bouncing off each other instead of inferring it from behaviour.

Frequently asked questions

Why does ERR_TOO_MANY_REDIRECTS happen on Nginx?

A 'return 301 https://$host$request_uri' block inside the HTTPS server block sends HTTPS traffic back to itself, producing an infinite loop behind a TLS-terminating proxy.

How do I fix ERR_TOO_MANY_REDIRECTS on Nginx?

Keep the redirect only in the port 80 server block, and behind a proxy redirect on $http_x_forwarded_proto = http rather than on the port.

What does ERR_TOO_MANY_REDIRECTS mean?

Two rules are bouncing the request back and forth — most often an HTTPS redirect at the application level fighting a proxy that is forwarding as plain HTTP, so each side thinks the other needs to upgrade.