"Too many redirects" means two rules disagree and each undoes the other: one sends http to https, something else sends https back to http, and the browser gives up after twenty round trips.

See the chain

Do not guess from the browser. Print every hop with its status and its destination.

curl -sIL https://yourdomain.com | grep -E "HTTP/|location:"

The repeating pair in that output is the fight. It names both sides.

The four pairs that cause it

  • A CMS site URL that disagrees with the server. WordPress set to http while the server forces https - each one corrects the other, forever.
  • www and non-www rules pointing at each other. Pick one canonical host and let the other redirect to it, once.
  • A proxy in front that terminates TLS. The server sees plain http, decides the visitor needs https, and redirects a request that already is https. It needs to read X-Forwarded-Proto.
  • A trailing-slash rule that adds and another that removes.

WordPress specifically

define('WP_HOME','https://yourdomain.com');
define('WP_SITEURL','https://yourdomain.com');

Setting both in wp-config.php pins them and stops the database value fighting the server.

Behind a proxy or a CDN, add $_SERVER["HTTPS"] = "on"; when X-Forwarded-Proto is https, before WordPress loads. Without it the site cannot tell that it is already secure.
Clear the browser cache before testing. A 301 is cached hard, and you will keep seeing a loop that no longer exists.