AH01630: client denied by server configuration: /var/www/html/admin/
#Отличие от общего 403
Эта запись в журнале означает, что запрет создан именно правилами авторизации по хосту: Require, Deny, Order. Это отличает её от 403 из-за прав файловой системы, где в журнале будут AH00035 или Permission denied. Если доступ закрыт к отдельному разделу (например, /admin/), скорее всего, ограничение по IP задано намеренно, но IP клиента определяется неверно, если сайт находится за прокси, CDN или балансировщиком: Apache видит адрес прокси, а не посетителя.
#Возможные причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Require all deniedЗакрыто намеренно или по ошибке. | Закрыт весь раздел. | Измените правило. |
| Ваш IP не в спискеДинамический адрес. | Раньше работало. | Обновите список. |
| Прокси скрывает реальный IPCDN, балансировщик. | Блокируется адрес прокси. | Настройте mod_remoteip. |
| Смешаны Order и RequireСтарые и новые директивы. | Непредсказуемый результат. | Оставьте Require. |
| Правило в .htaccessОтдельный каталог. | Конфиг чист, запрет есть. | Проверьте .htaccess. |
| IPv6 вместо IPv4Клиент пришёл по IPv6. | Список только для IPv4. | Добавьте IPv6. |
#Порядок
- Найдите строку в error.log и запомните путь и IP клиентаПо SSH найдите строку AH01630 в журнале Apache именно в момент запроса:
sudo grep AH01630 /var/log/apache2/error.log | tail -n 20на Debian/Ubuntu, на RHEL проверьте/var/log/httpd/error_log. Запишите путь, удалённый IP и применяемый виртуальный хост; отказ может быть намеренным правилом защиты. - Найдите применяемые к запросу правила доступа ApacheВыполните
apachectl -S, определите виртуальный хост и откройте его конфигурацию. Сравните<Directory>,<Location>,<Files>и разрешённые.htaccessдля пути, который указан в ошибке; более конкретная секция может изменить результат. Не добавляйте безусловноеRequire all grantedдля закрытых административных разделов. - Проверьте директивы Require: Require all denied, Require ip, Require notНайдите все относящиеся к пути директивы
Require:Require all denied,Require ip,Require host, отрицательные требования и контейнеры<RequireAll>/<RequireAny>. Определите, какая именно проверка отказывает настоящему клиенту, затем исправляйте только её — без отключения авторизации для других пользователей. - Проверьте старые Order/Deny/Allow: при смешивании с Require результатЕсли конфигурация перенесена с Apache 2.2, проверьте старые
Order,Deny,Allowи наличиеmod_access_compat. Механически смешивать их сRequireнельзя: приоритет зависит от действующих контейнеров. На стенде переведите правило на синтаксис Apache 2.4 и проверьте доступ разрешённого и запрещённого клиента. - Если сайт за прокси или CDN, включите mod_remoteip и настройтеЕсли Apache стоит за доверенным балансировщиком/CDN, в журнале может появляться IP прокси вместо клиента. Прежде чем включать
mod_remoteip, проверьте точные адресные диапазоны ваших доверенных прокси и маршрут. Не доверяйте любому входящемуX-Forwarded-Forиз Интернета: это позволит подделывать IP при проверке доступа. - Добавьте свой IP в список разрешённыхЕсли раздел должен быть доступен лишь администратору, укажите именно его актуальный публичный IP или одобренную сеть в соответствующем
Require ipпосле подтверждения и резервного копирования. Не вставляйте примерные диапазоны 203.0.113.0/24 как рабочие адреса; адрес может меняться, поэтому предусмотрите безопасный дополнительный способ администрирования. - Проверьте порядок слияния блоков: Location имеет приоритет над DirectoryУчитывайте, что Apache объединяет секции не просто по порядку строк: конфигурация
<Location>может переопределять файловые ограничения<Directory>. Перед редактированием изучите фактическую структуру и выводapachectl -S, особенно если есть прокси и вложенные.htaccess. - Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
- Перезагрузите конфигурациюСохраните конфигурацию и выполните
sudo apachectl configtest, затем приSyntax OK—sudo systemctl reload apache2(Debian) илиhttpd(RHEL). Проверьте страницу разрешённым пользователем и отдельно запрещённым, чтобы исправление AH01630 не открыло ранее закрытый ресурс.
#Отладка
Увеличьте детализацию журнала для модуля авторизации: LogLevel authz_core:debug в виртуальном хосте. В журнале появятся причины каждого решения. После отладки верните значение warn, чтобы не раздувать файл. Проверьте реальный IP посетителя, который видит Apache: добавьте в LogFormat переменную %a (клиентский IP) и сравните с ожидаемым.