Apache Linux 403

Apache 2.4: 403 Forbidden — AH01630 client denied by server configuration

  • Обновлено
  • Чтение ≈ 4 минуты
  • Нужны права администратора

Краткий ответ

Ошибка 403 Forbidden в Apache 2.4 вызвана отсутствием директивы Require all granted, неверными правами на каталоги, запрещённым листингом без index, SELinux или конфликтом .htaccess. Добавьте Require, проверьте права на всех уровнях пути и журнал ошибок.

В этой статье
  1. Причины 403 в Apache 2.4
  2. Причины 403
  3. Порядок
  4. Старый синтаксис
Apache 403 Forbidden
AH01630: client denied by server configuration / AH01276: Cannot serve directory: No matching DirectoryIndex
По-русскиСервер отказал в доступе к каталогу или файлу.

#Причины 403 в Apache 2.4

В Apache 2.4 изменилась система доступа: вместо старых Order allow,deny и Allow from all используется Require. Если для каталога нет Require all granted (и нет унаследованного правила), доступ запрещён. Другие причины: у каталогов или родительских путей нет права на выполнение/чтение для пользователя веб-сервера, нет индексного файла при выключенном листинге (Options -Indexes), SELinux блокирует доступ к нестандартному каталогу, правило в .htaccess запрещает доступ, файл принадлежит другому пользователю.

#Причины 403

Возможная причинаКак узнатьЧто делать
Нет Require all grantedКонфиг для 2.2.AH01630 в журнале.Добавьте Require.
Нет прав на родительские каталоги/home/user закрыт.Права 700 на пути.chmod +x по цепочке.
Нет индексного файлаПустой каталог.AH01276.Создайте index или включите листинг.
SELinuxНеверный контекст.Только на RHEL-системах.chcon/semanage.
Правило в .htaccessDeny from all.Закрыт каталог.Исправьте файл.
Запрет по IP или модулю безопасностиModSecurity, fail2ban.403 для части пользователей.Проверьте журнал аудита.

#Порядок

  1. Найдите в журнале точную причину отказа HTTP 403Подключитесь к Apache по SSH и найдите исходный запрос в error.log: на Debian/Ubuntu это часто /var/log/apache2/error.log, на RHEL — /var/log/httpd/error_log, в панели хостинга путь иной. Выполните sudo grep "AH01630" /реальный/путь/error.log | tail -n 20. Запишите точный URL, путь и время; AH01630 говорит об отказе правил доступа, а не об отсутствии index-файла.
  2. Проверьте блок <Directory> вашего сайта на наличие Require all grantedВыполните apachectl -S (на Debian также apache2ctl -S) и найдите виртуальный хост для домена. Откройте его конфигурацию и соответствующий блок <Directory /фактический/каталог>; проверьте Require all granted, Require ip, Require all denied и ограничения .htaccess. Не добавляйте Require all granted к закрытым папкам /admin/резервным копиям.
  3. Проверьте права на весь путь к каталогу сайтаЕсли журнал говорит Permission denied/AH00035, выполните namei -l /путь/к/index.php, чтобы увидеть владельцев и доступ к каждому родительскому каталогу. Сначала проверьте пользователя Apache и владельца PHP-FPM, затем исправляйте права только там, где нарушение доказано. Массовые chmod 755/644 по всем файлам могут открыть секретные файлы и испортить права загрузок.
  4. Проверьте индексный файл и правила DirectoryIndexЕсли журнал говорит directory index forbidden/AH01276, проверьте, что в документ-корне существует index.php или index.html и в конфигурации задан корректный DirectoryIndex. Не включайте листинг содержимого закрытых каталогов, чтобы обойти 403: это создаёт риск раскрытия файлов.
  5. Проверьте SELinuxНа системах RHEL/AlmaLinux/Rocky с SELinux выполните getenforce и sudo ausearch -m AVC -ts recent и сравните время отказа с запросом. Если отказ действительно вызван контекстом, задайте правильный тип через semanage fcontext и restorecon для конкретного каталога. Не отключайте SELinux и не выполняйте рекурсивный chcon без подтверждения причины.
  6. Проверьте .htaccess на директивы Deny, Require all deniedПроверьте файл .htaccess в каталоге сайта и родителях, если в Apache разрешён AllowOverride. Ищите Require all denied, Require ip и старые Order/Deny/Allow, влияние которых зависит от модулей. Перед изменением сохраните файл; если директива нужна для ограничения доступа, сохраните ограничение и исправьте только нужный URL.
  7. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Правильный блок для каталога сайта (Apache 2.4)
    ТекстКоманда
    Правильный блок для каталога сайта (Apache 2.4)
    <VirtualHost *:80>
    ServerName example.ru
    DocumentRoot /var/www/example.ru/public
    <Directory /var/www/example.ru/public>
    Options -Indexes +FollowSymlinks
    AllowOverride All
    Require all granted
    </Directory>
    DirectoryIndex index.php index.html
    </VirtualHost>
    Вариант 2Права на каждый каталог пути (нужно право x для пользователя веб-сервера)
    Linux · Терминал (Bash)Команда
    Права на каждый каталог пути (нужно право x для пользователя веб-сервера)
    namei -l /var/www/example.ru/public/index.php
    Вариант 3Выставить типовые права (владелец — пользователь сайта)
    Linux · Терминал (Bash)Команда
    Выставить типовые права (владелец — пользователь сайта)
    namei -l /var/www/example.ru/public/index.php
    # Не меняйте права всех файлов массово; устраните доказанное ограничение точечно.
    Вариант 4SELinux: разрешить чтение каталога веб-сервером (RHEL/CentOS)
    Linux · Терминал (Bash)КомандаНужен sudo
    SELinux: разрешить чтение каталога веб-сервером (RHEL/CentOS)
    getenforce
    sudo ausearch -m AVC -ts recent
    # Если SELinux действительно блокирует доступ, согласуйте точечную настройку контекста.
    Вариант 5Применить конфигурацию
    Linux · Терминал (Bash)КомандаНужен sudo
    Применить конфигурацию
    sudo apache2ctl configtest && sudo systemctl reload apache2
  8. После изменений проверьте синтаксис и перезагрузите конфигурациюПосле минимальной правки выполните sudo apachectl configtest (либо apache2ctl configtest), убедитесь в Syntax OK, затем sudo systemctl reload apache2 на Debian или httpd на RHEL. Откройте исходный URL и проверьте, что он доступен только предполагаемым пользователям, а закрытые ресурсы по-прежнему защищены.

#Старый синтаксис

Если в конфигурации остались Order allow,deny и Allow from all, модуль mod_access_compat обеспечивает совместимость, но смешивать старые и новые директивы нельзя. Замените их на Require all granted (открыть) или Require ip 203.0.113.0/24 (ограничить по сети), чтобы избежать неожиданных запретов.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.