Nginx Error 500: rewrite or internal redirection cycle — Решение
При попытке открыть сайт веб-сервер возвращает 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.
- Проверьте лог ошибок Nginx, чтобы увидеть точную цепочку зацикливания:
sudo tail -n 25 /var/log/nginx/error.log - Наиболее частая причина — ошибка в директиве
try_files. Исправьте конфигурацию в блокеlocation /:# НЕПРАВИЛЬНО (вызывает цикл, если index.php не найден): # try_files $uri $uri/ /index.php; # ПРАВИЛЬНО (передача аргументов и явный fallback): location / { try_files $uri $uri/ /index.php?$args; } - Убедитесь, что директива
rootуказана в блокеserver, а не дублируется внутри каждогоlocation:server { listen 80; server_name example.com; root /var/www/html/public; index index.php index.html; ... } - Проверьте физическое наличие индексного файла и права доступа на него:
ls -la /var/www/html/public/index.php - Если используются правила
rewrite, замените флагlastнаbreakво избежание повторного поиска location:rewrite ^/old/(.*)$ /new/$1 break; - Протестируйте и перезагрузите конфигурацию:
sudo nginx -t && sudo systemctl reload nginx.
try_files (например, /index.php), физически отсутствует на диске в директории root, Nginx повторно инициирует внутренний поиск по index и директивам location, что гарантированно приводит к циклу из 10 попыток и 500 ошибке.Частые вопросы (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;'.