Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
Nginx Error: rewrite rule loop detected in configuration block Linux / DevOps

Nginx Error: rewrite rule loop detected — Устранение зацикливания

Обновлено: 18.08.2026  ·  Официальная база знаний

При выполнении запроса веб-сервер аварийно возвращает статус 500 Internal Server Error. В файле error.log регистрируется зацикливание подсистемы переписывания адресов: rewrite rule loop detected in configuration block while processing URI или cycle while processing URI.

Флаг RewriteПоведение парсераРиск зацикливания
lastЗавершает текущий набор правил и перезапускает поиск location зановоВысокий при совпадении с тем же или родительским правилом
breakПрекращает обработку правил модуля rewrite и остается в текущем locationНулевой (цикл физически невозможен)
Без флагаПродолжает последовательное выполнение следующих правил rewriteСредний при цепочечных заменах
  • Пользователь видит ошибку 500 после длительного ожидания или мгновенно по исчерпанию лимита 10 внутренних итераций.
  • Включенный rewrite_log on; демонстрирует многократную бесконечную трансформацию одной и той же строки адреса.
  1. Включите подробное логирование механизма Rewrite в блоке server для поиска сбойного правила:
    error_log /var/log/nginx/error.log notice;
    rewrite_log on;
  2. Изучите лог ошибок и определите зацикленное регулярное выражение:
    sudo tail -n 30 /var/log/nginx/error.log | grep -E "rewritten|cycle"
  3. Замените флаг last на флаг break внутри блоков location:
    location /download/ {
        # БЫЛО (вызывало повторный поиск location и цикл):
        # rewrite ^/download/(.*)$ /files/$1 last;
        
        # СТАЛО (останавливает цикл обработки):
        rewrite ^/download/(.*)$ /files/$1 break;
        root /var/www/storage;
    }
  4. Убедитесь, что регулярное выражение не матчит результат собственной замены (например, rewrite ^/(.*)$ /prefix/$1 сопоставляется с /prefix/... до бесконечности). Добавьте исключение:
    rewrite ^/(?!prefix/)(.*)$ /prefix/$1 last;
  5. Проверьте валидность файла конфигурации и примените: sudo nginx -t && sudo systemctl reload nginx.
Золотое правило Nginx Rewrite: Флаг last используется преимущественно в контексте server, а флаг break — строго внутри контекста location. Использование last внутри location почти всегда приводит к скрытым петлям редиректов.
Практический опыт инженера: Если используете ЧПУ правила от старого Apache `.htaccess`, не конвертируйте их слепо в директивы `rewrite`. В Nginx 95% таких задач гораздо эффективнее и безопаснее решаются одной строкой `try_files $uri $uri/ /index.php?$args;`.

Частые вопросы (FAQ)

Почему Nginx прекращает обработку ровно после 10 итераций?

Значение 10 является защитным лимитом (hardcoded limit), предотвращающим бесконечное зависание рабочего процесса воркера Nginx и 100% утилизацию ядер процессора.

Что показывает директива rewrite_log on?

Она выводит в error.log (на уровне notice) подробные шаги работы регулярных выражений: исходный URI, совпавшее правило и полученный в результате преобразования новый URI.

Чем отличается флаг redirect от permanent в rewrite?

Флаг redirect возвращает клиенту внешний HTTP-редирект с временным кодом 302. Флаг permanent возвращает постоянный редирект с кодом 301, который кэшируется браузером.

Как переписать URL без изменения адресной строки у пользователя?

Используйте внутреннее переписывание с флагом break внутри location или директиву try_files.