#Что означает проблема
Директива Alias сопоставляет URL с физическим каталогом, который может находиться вне DocumentRoot. Разрешения, действующие на прежний DocumentRoot, автоматически не распространяются на новый путь. Если страница /assets/ открывается, а /assets/file.pdf получает 403, проверяйте целевую директорию, правила доступа и права на файл. Включать листинг каталога для исправления не нужно.
#Как различить причины
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет разрешения в Directory для цели AliasПуть Alias вне разрешённого дерева или более специфичное правило ограничивает вложенные папки. | В error.log отказ client denied by server configuration. | Настроить доступ только к публичному пути назначения Alias. |
| Отсутствуют права на родительские каталогиПроцесс Apache не может пройти по одному из компонентов пути. | В error.log Permission denied и разные результаты для отдельных вложений. | Проверить каждый компонент namei -l, исправить точечно. |
| Не совпадают косые черты и путиAlias /media/ указывает на физический путь, где структура отличается от ожидаемой. | Главный URL работает, а вложенные обращаются не к тем файлам. | Проверить пару URL → фактический путь и соглашение о завершающем /. |
#Подробная диагностика и устранение
- Запишите URL, который действительно запрещёнОткройте в браузере точный адрес вложенного публичного файла, например
/assets/manual.pdf, и зафиксируйте 403 и время. Сравните с соседним известным ресурсом и адресом каталога. Не проверяйте доступ на секретных или пользовательских документах: сначала выясните, предназначен ли файл для публичной выдачи. - Найдите соответствующий AliasПо SSH в Debian/Ubuntu выполните
sudo apache2ctl -S, откройте файл нужного VirtualHost и найдитеAliasдля пути. Например,Alias "/assets/" "/srv/example/assets/"означает, что/assets/manual.pdfдолжно находиться по/srv/example/assets/manual.pdf. У пары путей с завершающим слешем правила сопоставления отличаются от пути без него; не меняйте их без проверки зависимых ссылок. - Проверьте файл и доступ по всей цепочкеВыполните
sudo ls -l /srv/example/assets/manual.pdfиnamei -l /srv/example/assets/manual.pdf, заменив оба пути реальным адресом. Убедитесь, что ресурс существует, а Apache может пройти через родительские директории. Правоxнужно на каталогах,r— на файле. Не делайтеchmod 777и не отдавайте Apache права записи, если он должен только читать файлы. - Прочитайте причину запрета в журналеОткройте error.log VirtualHost на время запроса. Сообщение
client denied by server configurationтребует проверкиRequire,<Directory>,<Location>и правил авторизации. СообщениеPermission deniedуказывает на доступ ОС. Если ошибок нет, выясните, не блокирует ли URL Nginx или приложение до Apache. Не отключайте защиту общего каталога для диагностики. - Разрешите доступ именно к целевой публичной папкеЕсли ресурс предназначен для всех, создайте в конфигурации соответствующий
<Directory "/srv/example/assets"> Require all granted ... </Directory>. Этот блок адресует физическую папку после Alias. ИспользуйтеOptions -Indexes, если список содержимого папки не должен выводиться. Для вложенного приватного раздела задайте отдельные ограничения; не расширяйте доступ ко всему/srv. - Проверьте правила более поздних секцийЕсли основной Directory разрешает доступ, но вложенный ресурс запрещён, найдите дополнительные
<Directory>,<FilesMatch>,<Location>и правила .htaccess. Секции применяются в определённом порядке; более позднее правило может перекрывать раннее. Изменяйте только то правило, которое соответствует нужному URL; не убирайте ограничения для исполняемых и секретных типов файлов. - Сделайте копию, проверку и осторожное применениеПеред правкой сохраните точный файл конфигурации. Выполните
sudo apache2ctl configtest; если есть Syntax OK,sudo systemctl reload apache2. Если 403 сменился на 500 или другие URL стали открываться без прав, сразу восстановите копию, повторите configtest и reload. На системах с SELinux/AppArmor отдельно проверьте действующие политики доступа, не выключая их. - Протестируйте вложенный файл и закрытые областиПовторите запрос к известному публичному вложению, убедитесь в 200 либо ином ожидаемом коде и правильном типе содержимого. Проверьте, что запрашивание каталога без index не раскрывает список файлов, а приватная подпапка по-прежнему закрыта. При несовпадении результата перепроверьте фактический путь Alias и журналы.
- Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
#Как проверить результат
Публичный вложенный файл доступен, частные вложения остаются закрытыми, листинг отключён, а журнал не сообщает о запрете файловой системой или Require.
#Если проблема не устранена
Если Apache продолжает возвращать 403, проверьте точный целевой физический путь, все родительские каталоги, более специфичные правила Directory/Files/Location, а также политики защиты ОС. Не делайте рекурсивную смену прав вслепую.