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

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

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
Nginx Error 500: Internal Server Error (rewrite or internal redirection cycle) Linux / DevOps

Nginx Error 500: rewrite or internal redirection cycle — Решение

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

При попытке открыть сайт веб-сервер возвращает 500 Internal Server Error. В файле /var/log/nginx/error.log регистрируется ошибка зацикливания: rewrite or internal redirection cycle while internally redirecting to "/index.php" или cycle while processing uri "/index.html".

ПоведениеПредел NginxПричина ошибки
Внутренний редирект (Internal redirect)Максимум 10 итерацийДиректива try_files или rewrite зацикливает обработку URI
Поиск индексного файла (index)Циклический поискФайл index.php физически отсутствует в root каталоге
Вложенные locationМногократный matchНеправильное применение регулярок и директив last
  • Каждый запрос к корню сайта или ЧПУ-страницам приводит к превышению лимита 10 внутренних перенаправлений.
  • Nginx аварийно прерывает обработку запроса и отдает клиенту страницу с кодом 500.
  1. Проверьте лог ошибок Nginx, чтобы увидеть точную цепочку зацикливания:
    sudo tail -n 25 /var/log/nginx/error.log
  2. Наиболее частая причина — ошибка в директиве try_files. Исправьте конфигурацию в блоке location /:
    # НЕПРАВИЛЬНО (вызывает цикл, если index.php не найден): 
    # try_files $uri $uri/ /index.php;
    
    # ПРАВИЛЬНО (передача аргументов и явный fallback):
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
  3. Убедитесь, что директива root указана в блоке server, а не дублируется внутри каждого location:
    server {
        listen 80;
        server_name example.com;
        root /var/www/html/public;
        index index.php index.html;
        ...
    }
  4. Проверьте физическое наличие индексного файла и права доступа на него:
    ls -la /var/www/html/public/index.php
  5. Если используются правила rewrite, замените флаг last на break во избежание повторного поиска location:
    rewrite ^/old/(.*)$ /new/$1 break;
  6. Протестируйте и перезагрузите конфигурацию: sudo nginx -t && sudo systemctl reload nginx.
Критично: Если путь, указанный в конце try_files (например, /index.php), физически отсутствует на диске в директории root, Nginx повторно инициирует внутренний поиск по index и директивам location, что гарантированно приводит к циклу из 10 попыток и 500 ошибке.
Практический опыт инженера: В Laravel/Symfony проектах эта ошибка возникает в 99% случаев, если директива `root` ошибочно указывает на корень репозитория `/var/www/project`, а не на публичную папку `/var/www/project/public`.

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

Почему Nginx допускает только 10 внутренних перенаправлений?

Лимит в 10 итераций жестко зашит в исходный код Nginx для предотвращения бесконечной рекурсии и защиты сервера от 100% зависания CPU при ошибках в конфигурационных файлах.

В чем разница между rewrite флагами 'last' и 'break'?

'last' останавливает текущую обработку и перезапускает поиск подходящего location заново по измененному URI. 'break' прекращает выполнение директив модуля rewrite и продолжает обработку запроса строго внутри текущего location.

Почему ошибка 500 возникает только при запросе к главной странице?

Потому что при запросе к '/' Nginx ищет файлы из директивы index. Если они не найдены, управление передается в try_files, который снова отправляет запрос на поиск index, замыкая цикл.

Как включить трассировку rewrite-правил в логах Nginx?

Добавьте директиву 'rewrite_log on;' в блок server и повысьте уровень логирования: 'error_log /var/log/nginx/error.log notice;'.