#Что означает ошибка
403 Forbidden
Код 403 означает, что запрос дошёл до nginx, но доступ запрещён. В отличие от 404, ресурс найден (или должен быть найден), но nginx не может его отдать. Точную причину всегда показывает error.log: строки вида directory index of "/var/www/site/" is forbidden, open() failed (13: Permission denied) или access forbidden by rule.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
Нет index-файлаВ каталоге нет index.html/index.php, а листинг отключён. | В логе directory index ... is forbidden. | Добавьте файл или задайте index. |
Нет правПользователь nginx (www-data, nginx) не может читать файл или заходить в каталог. | Permission denied (13) в логе. | chmod/chown, права x на каждом уровне пути. |
| SELinuxКонтекст безопасности запрещает чтение. | На CentOS/AlmaLinux/Rocky; в audit.log отказы nginx. | Задайте контекст httpd_sys_content_t. |
Неверный rootroot ведёт на несуществующий каталог. | В логе No such file. | Исправьте путь. |
#Пошаговое решение
- Посмотрите журналНа сервере откройте
error.logNginx через панель или SSH, повторите запрос и найдите строку по времени и URL.directory index ... forbiddenговорит об отсутствии index,Permission denied— о правах файлов,access forbidden by rule— о запрете конфигурации; исправления отличаются. - Проверьте indexЕсли ошибка связана с индексом каталога, по SSH проверьте фактический
rootи существованиеindex.php/index.html, затем директивуindexв подходящемserver. Не включайтеautoindex onдля закрытых каталогов только ради устранения 403. - Проверьте права по всей цепочкеЕсли виден
Permission denied, определите пользователя рабочего процесса Nginx черезps -o user,cmd -C nginx, затемnamei -l /фактический/путь/к/файлу. У него должны быть права прохода через каталоги и чтения файла; в случае работы через PHP-FPM пользователь для записи может быть другим. - Исправьте праваИсправьте права только у проблемного файла/каталога после просмотра
ls -lи ACL; не используйтеchmod 777, массовоеchown -Rили изменение всего домашнего каталога. Если сайт размещён в/home, рассмотрите отдельный документ-корень с минимальными правами. - Проверьте SELinuxНа RHEL/AlmaLinux/Rocky с SELinux проверьте
getenforce,ls -Zи AVC-сообщения в журнале. Меняйте контекст только после подтверждённого отказа; отключение SELinux целиком может скрыть другие ошибки защиты. - Проверьте root и locationСравните
root,aliasи правилоlocationдля проблемного URL в выводеsudo nginx -T. Приaliasособенно важен завершающий/; запрет может относиться к другому каталогу, чем предполагает администратор. Перед правкой сохраните конфигурацию. - Перезагрузите nginxПосле изменения выполните
sudo nginx -t, убедитесь в успешном тесте и затемsudo systemctl reload nginx. Проверьте исходный URL и ресурсы, которые должны оставаться защищёнными; если ошибка повторилась, сопоставьте новыйerror.logсо старым.
#Диагностика
sudo tail -n 30 /var/log/nginx/error.lognamei -l /var/www/site/index.htmlps aux | grep "nginx: worker"getenforcenamei -l /var/www/site/index.htmlls -l /var/www/site/index.htmlgetenforce 2>/dev/null || true# Исправляйте владельца/ACL или контекст только у конкретного файла после диагностики.# Не выполняйте chown -R и массовый chmod для всего сайта.Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.