Apache Error AH00124: Request exceeded limit of 10 internal redirects — Фикс
Клиент при переходе на любую страницу сайта получает ошибку 500 Internal Server Error. В системном журнале error.log Apache регистрируется бесконечный цикл внутренних перенаправлений модуля переписывания URL: [core:error] [pid 1234:tid 5678] [client ...] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel rewrite:trace8' to trace the action.
| Причина зацикливания | Пример ошибочного правила | Механизм бесконечного цикла |
|---|---|---|
Отсутствие флага [L] | RewriteRule ^(.*)$ /index.php | Каждый результат переписывания снова прогоняется через весь список правил |
| Отсутствие проверки существования файла | Редирект без !-f / !-d | Запрос к index.php снова перенаправляется на index.php |
| Конфликт слэшей в конце URL | Правило принудительного добавления / | Циклический конфликт между редиректом Apache и роутером CMS |
- Браузер выводит ошибку 500 после нескольких миллисекунд зависания.
- Процессорное время сервера расходуется на пустые циклы трансляции URL.
- Откройте файл
.htaccessв корне сайта или конфигурацию виртуального хоста. - Классический правильный шаблон для CMS и фреймворков (WordPress, Laravel, Bitrix):
Убедитесь, что перед финальнымRewriteRuleстоят обязательные проверки на существование реального файла или папки на диске:RewriteEngine On RewriteBase / # Если запрошен реальный файл или папка — отдаем его напрямую: RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # Иначе отправляем запрос на единую точку входа index.php: RewriteRule ^ index.php [L] - Если используется перенаправление на HTTPS, предотвратите зацикливание при работе за Reverse Proxy (Cloudflare, Nginx):
RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] - Для детальной отладки включите трассировку модуля переписывания в блоке
VirtualHost:
и изучите лог, чтобы увидеть, какое именно правило вызывает повторный вход в цикл.LogLevel rewrite:trace3 - После исправления правил протестируйте синтаксис:
sudo apache2ctl configtest && sudo systemctl reload apache2.
LimitInternalRecursion 50. Это не исправит логическую ошибку в регулярных выражениях RewriteRule, а лишь заставит сервер совершать 50 бесполезных итераций перед падением, увеличивая нагрузку на CPU.Частые вопросы (FAQ)
Почему лимит по умолчанию равен именно 10 редиректам?
Значение 10 выбрано разработчиками Apache как разумный баланс: этого достаточно для любых сложных цепочек подстановок, но предотвращает полное зависание потока воркера при возникновении бесконечного цикла.
Что означает флаг [L] в RewriteRule?
Флаг [L] (Last) приказывает серверу остановить текущий проход по списку правил mod_rewrite для данного запроса. Однако в контексте .htaccess при изменении URI сервер может начать новый проход, если нет условия RewriteCond %{REQUEST_FILENAME} -f.
Что означает флаг [END] в Apache 2.4?
Флаг [END] полностью прекращает выполнение всех правил mod_rewrite и блокирует запуск повторных внутренних подзапросов в контексте каталога (доступен начиная с Apache 2.3.9).
Как временно отключить .htaccess для проверки?
Переименуйте файл: mv .htaccess .htaccess.bak и проверьте, исчезла ли ошибка 500.