#Что означает ошибка
Слишком много перенаправлений
ERR_TOO_MANY_REDIRECTS означает, что браузер ходит по кругу: сервер отвечает редиректом на адрес, который снова перенаправляет назад. Для сайта на nginx типичный сценарий — правило http→https или www→без www конфликтует с другим слоем (Cloudflare, балансировщик, приложение).
Чтобы найти петлю, не гадайте: проследите цепочку редиректов из консоли.
Команда curl -IL https://example.com покажет каждый шаг с заголовком Location.
Найдите петлю редиректов в конфиге и CMS, проверьте Cloudflare и proxy.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Двойной редиректКонфиг. | Проявляется как «Слишком много перенаправлений» или близкий по смыслу сбой. | Уберите. |
| CloudflareFlexible SSL. | Проявляется как «Слишком много перенаправлений» или близкий по смыслу сбой. | Full. |
| ProxyЗаголовки. | Проявляется как «Слишком много перенаправлений» или близкий по смыслу сбой. | Передайте X-Forwarded-Proto. |
| CMSНастройка. | Проявляется как «Слишком много перенаправлений» или близкий по смыслу сбой. | Исправьте URL. |
#Пошаговое решение
- Проследите цепочку редиректовНа своём компьютере откройте Терминал/PowerShell с установленным curl и выполните
curl -IL --max-redirs 10 https://example.com, заменив домен своим. Запишите последовательность ответовHTTP/1.1 301/302и заголовковLocation, особенно чередование http/https или www/без www. Проверьте все четыре исходных адреса отдельно, поскольку цикл может затрагивать лишь один вариант. - Найдите все редиректы в конфигурацииАдминистратор через SSH выполняет
sudo nginx -T 2>&1 | grep -nE "return 30[1278]|rewrite|server_name", затем открывает реальные файлы конфигурации соответствующихserverиlocation. Сравните редиректы Nginx,.htaccessу Apache, настройки приложения и CDN; одна и та же смена схемы на разных уровнях часто образует цикл. Сохраните копии до исправления. - Проверьте режим SSL у проксиЕсли перед сайтом Cloudflare или другой прокси, проверьте в её панели режим подключения к исходному серверу и наличие правильного сертификата у исходного сервера. В Cloudflare «Flexible» вместе с принудительным HTTPS на сервере часто создаёт цикл; режим Full (strict) допустим только при корректном сертификате на origin. Не меняйте режим вслепую без проверки доступности backend.
- Исправьте блоки serverВыберите один канонический адрес (например,
https://example.com) и настройте перенаправление HTTP и лишнего имени хоста ровно один раз. В HTTPS-блоке Nginx для целевого имени должен работать сайт без повторной отправки на тот же адрес. Если WordPress хранит другойhome/siteurl, исправьте его отдельно после резервной копии; правила разных серверов не должны перенаправлять друг на друга. - Проверьте и перезагрузите nginxВыполните
sudo nginx -t, затем при успешном тестеsudo systemctl reload nginx. Снова проверьте цепочкуcurl -ILи откройте сайт в приватном окне браузера; кэшированные постоянные редиректы могут остаться в обычном профиле. Если цикл виден только через CDN, повторите диагностику с выключенным кэшем CDN или по согласованному способу тестирования origin.
#Диагностика цепочки
Выполните curl -sIL -o /dev/null -w "%{url_effective} %{num_redirects}\n" https://example.com и curl -IL http://example.com. Если один и тот же адрес повторяется — петля найдена. Посмотрите также nginx -T | grep -n "return 301\|rewrite", чтобы увидеть все редиректы в конфигурации.
#Типичная причина: Cloudflare или балансировщик
Если перед nginx стоит прокси, который терминирует TLS, то до nginx запрос приходит по HTTP, а nginx снова отправляет его на HTTPS — бесконечно. Решения: в Cloudflare выберите режим SSL «Full (strict)», а не «Flexible»; либо проверяйте заголовок схемы: if ($http_x_forwarded_proto = "http") { return 301 https://$host$request_uri; } вместо безусловного редиректа. Приложению (PHP, Laravel, WordPress) тоже нужно знать, что оно за прокси: передайте fastcgi_param HTTPS on; или X-Forwarded-Proto.
#Правильный шаблон редиректов в nginx
Отдельные блоки server: первый для порта 80 с return 301 https://example.com$request_uri;, второй для 443 с server_name www.example.com; return 301 https://example.com$request_uri; для www и основной блок для example.com. Избегайте rewrite ^ https://$host$request_uri permanent; внутри блока 443. Проверьте синтаксис nginx -t и примените systemctl reload nginx.
#Чем ещё вызывается
Редиректы одновременно в .htaccess или коде CMS и в nginx; кэш браузера (301 запоминается — проверяйте в режиме инкогнито или очистите кэш); редирект на страницу логина, которая сама требует логин из-за неработающих cookie (проверьте Set-Cookie, домены и флаг Secure).
curl -sIL -o /dev/null -w "%{url_effective} redirects=%{num_redirects}\n" http://example.comsudo nginx -t && sudo systemctl reload nginx