Nginx Error 403: directory index of is forbidden — Как исправить
При переходе на главную страницу или в любой подкаталог сайта браузер выдает ошибку 403 Forbidden. В журнале error.log регистрируется: directory index of "/var/www/html/" is forbidden, client: ..., server: example.com, request: "GET / HTTP/1.1".
| Фактор | Состояние системы | Причина запрета |
|---|---|---|
Индексный файл (index.html / index.php) | Физически отсутствует в каталоге root | Nginx не нашел файл по умолчанию для отдачи клиенту |
Директива autoindex | off (по умолчанию) | Генерация листинга файлов директории запрещена политикой безопасности |
Директива index | Не объявлена или не содержит нужного расширения | Nginx не знает, какой именно файл является стартовой точкой |
- Прямой запрос к существующим файлам (например,
http://example.com/logo.png) работает отлично. - Ошибка 403 возникает строго при запросе к URL, оканчивающимся на слэш
/(каталогам).
- Проверьте фактическое наличие индексного файла в директории вашего сайта:
ls -la /var/www/html/ - Убедитесь, что в конфигурации виртуального хоста в блоке
serverилиlocation /прописана директиваindexсо всеми необходимыми файлами:server { listen 80; server_name example.com; root /var/www/html; # Добавьте index.php и index.html: index index.php index.html index.htm; location / { try_files $uri $uri/ =404; } } - Если этот виртуальный хост предназначен для раздачи файлов (файловый архив, репозиторий) и вам требуется отображать список файлов директории, включите модуль
autoindex:location /downloads/ { autoindex on; autoindex_exact_size off; autoindex_localtime on; } - Проверьте синтаксис конфигурации и примените изменения:
sudo nginx -t sudo systemctl reload nginx
autoindex on; на production-сайтах категорически не рекомендуется без необходимости, так как это раскрывает злоумышленникам структуру каталогов, резервные копии (.bak, .sql) и конфиги.Частые вопросы (FAQ)
Почему Nginx выдает 403 Forbidden, а не 404 Not Found?
Потому что директория физически существует на диске. Nginx пытается обработать запрос к директории, но так как индексный файл не найден, а листинг каталога (autoindex) отключен, сервер запрещает доступ по коду 403.
Что делает директива autoindex_exact_size off?
Она переключает отображение точного размера файлов в байтах на человекочитаемый формат (КБ, МБ, ГБ).
Почему index.php не открывается автоматически при наличии директивы index?
Убедитесь, что в конфигурации настроена секция location ~ \.php$ для передачи исполнения FastCGI-серверу (PHP-FPM).
Как кастомизировать страницу со списком файлов при autoindex on?
Используйте сторонний модуль ngx_http_fancyindex_module, позволяющий добавлять темы оформления и CSS к листингу файлов.