Траблшутинг ошибок 403 Forbidden в Apache: Directory, .htaccess и AllowOverride
- Клиенты получают ошибку
HTTP 403 Forbiddenпри попытке открытия директории или файла. - В
error.logApache появляется запись:AH01630: client denied by server configuration. - В
error.logфиксируется:AH00670: Options FollowSymLinks and SymLinksIfOwnerMatch are both off, so the Readlink of /var/www/... will not be allowed.
1. Анализ логов Apache
tail -n 30 /var/log/apache2/error.log # Debian/Ubuntu
tail -n 30 /var/log/httpd/error_log # RHEL/Rocky2. Исправление политики контроля доступа Apache 2.4
Синтаксис Apache 2.2 (Order allow,deny) устарел. В /etc/apache2/sites-available/example.conf задайте актуальные директивы:
<Directory /var/www/html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>3. Проверка прав файловой системы (POSIX Permissions)
Apache должен иметь права на чтение файлов и право execute (+x) на каждый родительский каталог в дереве путей:
# Установка владельца и базовых прав
chown -R www-data:www-data /var/www/html
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;4. Исправление запрета Directory Index
Если в папке отсутствует index.html/index.php, а опция Options -Indexes выключена, Apache вернет 403. Укажите индексный файл:
DirectoryIndex index.php index.html5. Проверка и перезагрузка
apachectl configtest && systemctl reload apache2 Частые вопросы (FAQ)
Что означает ошибка AH01630: client denied by server configuration?
В блоке <Directory> отсутствует директива 'Require all granted', либо глобальная конфигурация запрещает доступ (Require all denied), а локальный VirtualHost не переопределяет ее.
Зачем нужна опция AllowOverride All?
Директива AllowOverride All разрешает файлам .htaccess переопределять глобальные директивы маршрутизации (RewriteRule), авторизации и заголовков. При значении 'None' файлы .htaccess полностью игнорируются.