Траблшутинг циклических редиректов (301/302 Redirect Loop) в Nginx и Apache
- Браузер возвращает ошибку
ERR_TOO_MANY_REDIRECTS. - Утилита
curl -ILфиксирует бесконечную цепочку ответов HTTP 301/302 между HTTP и HTTPS. - SSL-терминация на балансировщике (Cloudflare, AWS ALB, Nginx) вызывает цикл из-за отсутствия передачи реальной схемы бэкенду.
1. Трассировка цепочки редиректов через curl
curl -IL -k -H "User-Agent: Mozilla/5.0" https://example.com2. Исправление SSL Offloading в Nginx
Если перед Nginx стоит внешний CDN/балансировщик, проксирующий трафик по HTTP, добавьте проверку заголовка X-Forwarded-Proto:
server {
listen 80;
server_name example.com www.example.com;
# Проверка схемы от вышестоящего прокси
if ($http_x_forwarded_proto = 'http') {
return 301 https://$host$request_uri;
}
}Или стандартный безусловный редирект для прямого трафика:
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}3. Исправление циклических правил в Apache (.htaccess)
Отредактируйте .htaccess с учетом SSL-терминации:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]4. Проверка и перезагрузка
nginx -t && systemctl reload nginx
apachectl configtest && systemctl reload apache2 Частые вопросы (FAQ)
Почему Cloudflare вызывает циклический редирект при режиме SSL Flexible?
В режиме Flexible Cloudflare запрашивает бэкенд по незашифрованному HTTP (порт 80). Если сервер настроен на принудительный редирект с HTTP на HTTPS, бэкенд отправляет 301 редирект обратно в Cloudflare, образуя бесконечный цикл. Решение — переключить Cloudflare в режим 'Full (Strict)' или анализировать заголовок X-Forwarded-Proto.
Как сбросить кэш 301 редиректа в браузере?
HTTP 301 (Moved Permanently) агрессивно кэшируется браузерами на диске. Для сброса используйте режим инкогнито, DevTools с включенным 'Disable cache' или горячие клавиши Ctrl+F5.