#Что означает ошибка
403
Ошибка 403 Forbidden в Apache при строке AH01630: client denied by server configuration почти всегда связана с директивой Require в конфигурации Apache 2.4 или с правами файловой системы.
В Apache 2.2 использовалось Order allow,deny, в 2.4 — Require all granted. Старые конфигурации после обновления начинают отдавать 403.
Журнал ошибок точно указывает причину, поэтому начните с него.
Добавьте Require all granted и проверьте права на каталог.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет RequireApache 2.4. | Проявляется как «403» или близкий по смыслу сбой. | Добавьте. |
| ПраваКаталог. | Проявляется как «403» или близкий по смыслу сбой. | Выдайте. |
| AllowOverride.htaccess. | Проявляется как «403» или близкий по смыслу сбой. | Включите. |
| SELinuxКонтекст. | Проявляется как «403» или близкий по смыслу сбой. | Настройте. |
#Пошаговое решение
- Прочитайте журнал ошибокВ терминале сервера найдите конкретную строку 403 в
error.logApache и текст отказа AH01630/Permission denied; на Debian путь часто/var/log/apache2/error.log, на RHEL —/var/log/httpd/error_log. Сопоставьте с запрошенным URL и IP клиента, поскольку правило доступа может намеренно закрывать этот путь. - Проверьте директиву RequireВыполните
apachectl -S, откройте виртуальный хост нужного сайта и применяемый к фактическому каталогу блок<Directory>.Require all grantedуместно только в публичном корне сайта и только если нет требований авторизации; если в конфигурации стоитRequire ip, проверьте разрешённые адреса вместо глобального открытия доступа. - Проверьте праваПри сообщении о файловых правах выполните
namei -l /фактический/путь/index.phpи сравните разрешения каждого каталога с пользователем Apache. Не выполняйте массовыеchmod/chown; исправляйте конкретное препятствие после сохранения прежнего владельца и оценки влияния на загрузки и секретные конфиги. - Проверьте SELinuxНа системах SELinux проверьте
getenforce,ls -Z /путь/сайтаи журнал аудита на момент отказа. Если выявлен неправильный контекст, примените штатную настройкуsemanage fcontextиrestoreconдля нужного дерева. Не отключайте SELinux и не меняйте контексты до подтверждения причины. - Проверьте и перезагрузите конфигурациюСохраните копию конфигурации, выполните
sudo apachectl configtest, приSyntax OK—sudo systemctl reload apache2на Debian либоhttpdна RHEL. В браузере повторите запрос к публичному URL и отдельно проверьте закрытые каталоги, которые должны оставаться недоступными.
#Журнал и директива
Откройте журнал: sudo tail -n 30 /var/log/apache2/error.log (CentOS: /var/log/httpd/error_log). Для каталога задайте: <Directory /var/www/site>\n Options -Indexes +FollowSymLinks\n AllowOverride All\n Require all granted\n</Directory>. Проверьте, что в apache2.conf корневой каталог / не открыт, а ваш каталог разрешён.
#Права файловой системы
Apache должен иметь право входить во все родительские каталоги. Проверьте: namei -l /var/www/site/index.html. Нужен бит x на каждом каталоге пути и r на файлах. Исправление: sudo chown -R www-data:www-data /var/www/site, find /var/www/site -type d -exec chmod 755 {} \;, find /var/www/site -type f -exec chmod 644 {} \;.
#SELinux и .htaccess
На CentOS/RHEL проверьте SELinux: ls -Z /var/www/site, при необходимости sudo chcon -R -t httpd_sys_content_t /var/www/site. Если нет index.html, а листинг запрещён, будет 403: добавьте индексный файл или DirectoryIndex index.php. Проверьте .htaccess: правила Deny from all, Require all denied и блокировки по IP.
sudo tail -n 30 /var/log/apache2/error.lognamei -l /var/www/site/index.htmlsudo apachectl configtest