#Симптом и границы применимости
После chmod, chown, миграции или распаковки Nginx возвращает 403 на CSS, изображения или другие файлы, а динамические страницы доступны. Ошибка может быть не в самом файле, а в отсутствии права прохода по одному из его родительских каталогов или в правилах доступа.
#Возможные причины и как их отличить
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет права прохода по каталогуДля открытия файла процессу нужен доступ к каждому родительскому каталогу. | В error_log permission denied; на одном уровне каталога нет x | Проверить namei -l и владельцев |
| Право чтения у файла отсутствуетНельзя лечить массовым chmod 777. | Ошибка касается конкретного файла и ls -l показывает отсутствие чтения | Вернуть корректные права из известной рабочей версии |
| 403 задан правилами location или системой MACДополнительные ограничения могут срабатывать независимо от UNIX-прав. | Файл читается пользователем, но в error_log access forbidden либо AVC | Проверить deny и контекст SELinux/AppArmor |
#Пошаговая диагностика и исправление
- Зафиксируйте точный URL и кодОткройте средства разработчика браузера (обычно F12), вкладку «Сеть», обновите страницу и выберите CSS/изображение с кодом 403. Скопируйте путь URL без параметров авторизации; проверьте curl -I. Не меняйте права до определения локального пути файла.Linux · Терминал (Bash)КомандаКлиентский терминал; путь замените действительным; запрос не меняет сайт.
curl -I https://example.com/assets/site.css
- Выясните сопоставление URL и пути файлаНа сервере в nginx -T найдите server_name, root и location для /assets/. У alias иной способ формирования пути, чем у root. Если файл обрабатывается upstream, причина может находиться в приложении. Запишите фактический путь в файловой системе.Linux · Терминал (Bash)КомандаНужен sudoКоманда чтения; полный вывод может быть конфиденциальным.
sudo nginx -T 2>&1 | grep -nE "server_name|root |alias |location |deny |allow "
- Читайте журнал ровно в момент запросаВ первом SSH-окне откройте error_log соответствующего сайта, во втором повторите curl. Различайте (13: Permission denied), directory index forbidden и access forbidden by rule: последним двум изменение chmod может не помочь.
- Уточните действительный путь error_log; используется пример обычной установкиLinux · Терминал (Bash)КомандаНужен sudoУточните действительный путь error_log; используется пример обычной установки.
sudo tail -n 60 /var/log/nginx/error.log
- Проверьте каждый участок путиПодставьте в namei фактический путь файла. На выводе отметьте владельца, группу и биты каждого каталога; узнайте пользователя worker Nginx и проверьте доступ только для него. Не выполняйте рекурсивное chown/chmod: оно может нарушить безопасность других сайтов.Linux · Терминал (Bash)КомандаТолько чтение, оба пути заменить фактическими.
namei -l /var/www/example.com/public/assets/site.css; ls -l /var/www/example.com/public/assets/site.css
- Установите минимально необходимые разрешенияВерните права и владельцев из резервной копии или из правил деплоя для одного повреждённого объекта. Если каталог должен быть доступен группе, настройте точечную группу/ACL, а не открывайте файл всем на запись. На системах с SELinux просмотрите сообщения аудита и восстановите утверждённый контекст без отключения защиты.
- Проверьте настройки веб-сервераЕсли причиной стал deny или location, поправьте только правило для выбранного каталога, предварительно сохранив исходный фрагмент. Выполните тест синтаксиса, затем перечитайте настройки; при ошибке теста остановитесь и верните копию.
- Дополнительная команда по темеLinux · Терминал (Bash)С осторожностьюНужен sudoПеречитывание нужно только при изменении конфигурации; изменение прав файла действует сразу.
sudo nginx -t && sudo systemctl reload nginxКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить результат
Обновите страницу с отключённым кэшем. Убедитесь, что прежний URL возвращает 200 и правильный Content-Type; проверьте, что закрытые каталоги и конфигурационные файлы не стали общедоступны.
#Если проблема не устранена
Если 403 остался при правильных правах, исследуйте alias, index, правила deny, MAC-контексты и промежуточный прокси. Не расширяйте права всего /var/www ради одного файла.