Серверы HTTP Nginx

Ошибка 403 Forbidden: причины и исправление

Ошибка 403 Forbidden: найдите источник запрета по журналам, проверьте индексный файл, права, правила Nginx или Apache и блокировку IP.

Наталья Соколова
Наталья Соколова

Self-hosted проекты, безопасность и почта

Она объясняет почтовый хостинг, базовую безопасность, VPS для личных проектов и разумные границы самостоятельности.

8 мин чтения

Ошибка 403 Forbidden означает, что сервер получил запрос, но отказал в доступе к ресурсу. Владельцу сайта нужно сначала посмотреть журнал веб-сервера, затем проверить индексный файл, права и владельца, правила Nginx или Apache, ограничения по IP и защитный экран. Пользователю достаточно исключить ошибочный адрес, авторизацию и блокировку сети.

Сначала определите, кто получил отказ

Сначала ограничение: не меняйте права наугад. Один и тот же ответ браузера может появиться из-за запрета в приложении, веб-сервере, панели хостинга, CDN или защитном экране. Массовая команда chmod часто скрывает причину и одновременно открывает файлы лишним пользователям.

Начните с трёх проверок:

  • откройте точный адрес без лишнего сегмента пути;
  • войдите в учётную запись, если раздел закрыт авторизацией;
  • сравните ответ из обычной сети и мобильного подключения, не используя вторую сеть для обхода осознанной блокировки.

Если отказ видит один посетитель, вероятны авторизация, ограничение по адресу или сработавшая защита. Если его видят все, проверяйте публикацию файлов, настройки виртуального хоста и приложение. Если ошибка появилась после переноса или обновления, первым подозреваемым становится изменённая конфигурация.

Получите только заголовки ответа:

curl -I https://example.ru/path/

Заголовок Server иногда подсказывает, какой слой ответил, но полагаться на него нельзя: прокси может скрыть или заменить значение. Надёжнее сопоставить время запроса с журналами каждого слоя.

НаблюдениеЧто проверять первымЧего не делать
Отказ только для одного адресаNginx allow/deny, Apache Require, защитный экран, CDNНе отключать всю фильтрацию
Отказ на адрес каталогаИндексный файл, директиву index, запрет листингаНе включать листинг ради проверки на боевом сайте
Отказ после переноса файловВладельца, права на весь путь, SELinuxНе назначать всем право записи
Отказ после изменения конфигурацииПоследний diff, синтаксис, область действия правилНе перезапускать сервис до проверки
Отказ только из приложенияМаршрут, роль пользователя, промежуточное ПОНе править системные права без записи в журнале

Журнал обычно называет реальную причину

Смотрите одну попытку, а не весь архив. Откройте журнал ошибок, повторите запрос и найдите свежую запись по времени, адресу и пути. Расположение журнала зависит от дистрибутива и конфигурации, поэтому сначала посмотрите директиву error_log или настройки панели.

Для Nginx можно проверить активную конфигурацию и затем прочитать выбранный журнал:

nginx -T
tail -f /path/to/nginx-error.log

Для Apache полезны дамп виртуальных хостов и журнал нужного сайта:

apachectl -S
tail -f /path/to/apache-error.log

Запись permission denied ведёт к правам, владельцу или SELinux. Сообщение directory index is forbidden указывает на запрос каталога без подходящего индексного файла. Явный access forbidden by rule означает, что отказ создало правило доступа, а не файловая система.

Если журнал веб-сервера пуст, ответ мог прийти раньше: от CDN, защитного экрана, балансировщика или панели хостинга. Тогда ищите событие в соответствующем журнале, а не ослабляйте Nginx.

Проверьте индексный файл и корень сайта

Запрос каталога требует понятного результата. Nginx проверяет файлы, перечисленные в директиве index, по порядку. Если подходящего файла нет, а просмотр содержимого каталога запрещён, сервер не обязан показывать список файлов.

Сверьте корень сайта и фактический путь:

nginx -T | grep -E 'server_name|root|index'
find /srv/www/site/public -maxdepth 1 -type f -print

Для обычного статического сайта достаточно явно перечислить существующий индексный файл:

location / {
    index index.html;
    try_files $uri $uri/ =404;
}

Не включайте autoindex только ради исчезновения ошибки. Листинг раскрывает имена файлов и структуру каталога, хотя задача сайта обычно состоит в отдаче индексной страницы.

В Apache ту же роль выполняет DirectoryIndex. Проверьте, что виртуальный хост смотрит в нужный DocumentRoot, а правило применяется к тому же каталогу. После переноса особенно легко исправлять старый путь, пока запрос обслуживает новый.

Права важны на каждом компоненте пути

Чтения файла недостаточно. Рабочий процесс веб-сервера должен иметь возможность пройти через родительские каталоги и прочитать конечный файл. Команда namei показывает права каждого компонента пути и быстрее обнаруживает закрытый родительский каталог.

namei -l /srv/www/site/public/index.html
ls -ld /srv /srv/www /srv/www/site /srv/www/site/public
ls -l /srv/www/site/public/index.html

Сначала выясните пользователя рабочего процесса и владельца файлов. Затем исправляйте только ошибочный объект. Символьная запись яснее случайно скопированных восьмеричных значений:

chmod u=rwx,go=rx /srv/www/site/public
chmod u=rw,go=r /srv/www/site/public/index.html

Эти команды являются примером для публично читаемого статического файла, а не универсальным рецептом. Приложению может понадобиться запись в отдельный каталог загрузок, но не во весь корень. Закрытые конфигурационные файлы, ключи и резервные копии не должны становиться общедоступными.

Не запускайте рекурсивную смену владельца до выяснения модели развёртывания. Она может сломать обновления, контейнерные тома и изоляцию между сайтами. Сначала сохраните текущие значения, затем меняйте минимальный путь и повторяйте один запрос.

Nginx и Apache могут запрещать доступ намеренно

Правило запрета может быть корректным. В Nginx директивы allow и deny ограничивают клиентов по адресу, а порядок правил влияет на результат. Проверьте не только блок location, но и наследование на уровнях server и http.

location /admin/ {
    allow 192.0.2.0/24;
    deny all;
}

Не удаляйте deny all, если раздел действительно должен быть закрыт. Добавьте нужную сеть только после проверки её назначения и риска. Перед применением изменений выполните синтаксическую проверку:

nginx -t

В Apache современные правила используют Require. Директива Require all denied создаёт безусловный запрет, а Require ip разрешает выбранный адрес или сеть. Старые сочетания Order, Allow и Deny считаются устаревшими и могут вести себя неожиданно рядом с новыми правилами.

<Directory /srv/www/site/public/admin>
    Require ip 192.0.2.0/24
</Directory>

Проверьте конфигурацию до мягкой перезагрузки:

apachectl configtest

Файл .htaccess тоже может вернуть отказ через Require или RewriteRule с флагом F. Не удаляйте его. Сохраните копию, временно исключите одно подозрительное правило и верните его, если результат не изменился.

SELinux проверяют после обычных прав

Открытые права не отменяют политику SELinux. На системах с включённым SELinux веб-сервер может читать только файлы с подходящим контекстом. Это особенно заметно после переноса сайта из домашнего каталога или распаковки архива в новый путь.

Сравните контекст рабочего каталога и стандартного каталога веб-сервера:

getenforce
ls -Zd /srv/www/site/public
ls -Z /srv/www/site/public/index.html

Не отключайте SELinux для проверки. Посмотрите журнал отказов и восстановите ожидаемый контекст, если для пути уже существует корректное правило:

ausearch -m AVC -ts recent
restorecon -Rv /srv/www/site/public

Для нестандартного постоянного корня сначала задают правило через semanage fcontext, затем применяют restorecon. Случайный chcon даёт временный результат и может исчезнуть после переразметки файловой системы.

Проверьте внешний защитный слой и приложение

Не всякий запрет рождается в веб-сервере. CDN, защитный экран приложения, модуль безопасности, ограничитель частоты и само приложение могут вернуть тот же код. Признак внешнего слоя — отсутствие записи в журнале Nginx или Apache при наличии события в панели защиты.

Сопоставьте время, адрес клиента, путь, метод запроса и идентификатор события. Если правило ложноположительное, сузьте исключение до конкретного пути или сигнатуры. Полное отключение защиты превращает локальную неисправность в общий риск.

В приложении проверьте маршрут и роль пользователя. Отказ после входа часто означает, что аутентификация прошла, но роли недостаточно. Это не повод выдавать административные права всей группе.

На виртуальном хостинге Beget или Timeweb у владельца может не быть доступа к системной конфигурации. Используйте журналы и средства панели, а затем передайте поддержке точное время, адрес, путь и способ воспроизведения. На VPS, включая серверы Selectel, конфигурация и системные журналы остаются зоной ответственности администратора.

Безопасная последовательность исправления

Чек-лист

  • Зафиксируйте запрос: запишите время, точный адрес, метод и сеть клиента, чтобы найти одну попытку во всех журналах.
  • Найдите слой отказа: сопоставьте журналы CDN, веб-сервера и приложения, не меняя несколько уровней одновременно.
  • Проверьте публикацию: сверьте корень сайта, индексный файл, владельца и доступ по каждому компоненту пути.
  • Проверьте правила: найдите deny, Require, RewriteRule, ограничение адреса или событие защитного экрана, сохраняя осознанные запреты.
  • Протестируйте изменение: выполните проверку синтаксиса, примените одну правку и повторите исходный запрос из той же сети.

После исправления верните временно исключённые правила и убедитесь, что закрытые разделы по-прежнему закрыты. Ошибка исчезла — это ещё не доказательство безопасности. Нужен контрольный запрос к публичной странице и отдельная проверка защищённого пути.

Когда обращаться в поддержку

Сначала граница ответственности: поддержка нужна, когда слой недоступен вам. На общем хостинге передайте точный адрес, время с часовым поясом, внешний IP и скриншот ответа. Добавьте, видят ли отказ другие сети и что менялось перед появлением ошибки.

Не отправляйте пароль, закрытый ключ или полную конфигурацию с секретами. Если поддержка предлагает рекурсивно открыть запись всему сайту, попросите назвать строку журнала и конкретный путь, который не может прочитать веб-сервер.

Частые вопросы

Можно ли исправить ошибку 403 очисткой кэша?
Иногда это помогает посетителю при устаревшей сессии, но не исправляет запрет в правах, конфигурации сервера или защитном экране. Если отказ повторяется из другой сети и в приватном окне, владельцу нужны журналы.
Почему 403 появляется только у одного пользователя?
Чаще всего различаются адрес сети, учётная запись, роль, cookie или признаки запроса, по которым сработала защита. Сравните два запроса по времени и журналам, не отключая фильтр для всех.
Нужно ли ставить максимальные права на папку сайта?
Нет. Веб-серверу нужен минимальный доступ к конкретным каталогам и файлам. Общая запись для всех скрывает проблему владельца или контекста и увеличивает последствия взлома.
Почему индексный файл существует, а сервер всё равно отвечает 403?
Проверьте фактический корень виртуального хоста, имя файла в директиве index или DirectoryIndex, доступ к каждому родительскому каталогу и контекст SELinux. Файл может лежать не в том каталоге, который обслуживает запрос.
Можно ли временно отключить защитный экран?
Лучше найти событие и создать узкое исключение для проверенного запроса. Полное отключение защиты допустимо только в изолированной среде, где внешний трафик не попадёт на сайт.

Практичный вывод

Ошибка 403 — это не диагноз, а решение одного из слоёв отказать в доступе. Рабочий порядок всегда одинаков: воспроизвести запрос, найти запись, определить слой, изменить одно правило и повторить проверку. Не берите то исправление, которое не можете объяснить строкой журнала: случайно открытый сайт обычно опаснее временно закрытого.

Статью подготовили

Наталья Соколова
Наталья Соколова

Self-hosted проекты, безопасность и почта

Она объясняет почтовый хостинг, базовую безопасность, VPS для личных проектов и разумные границы самостоятельности.

Проверка фактов

HostScout editorial

Статьи по теме

Ошибка 502 Bad Gateway: причины и исправление

Что означает ошибка 502, что может сделать посетитель и как владельцу сайта проверить CDN, прокси, веб-сервер и приложение без слепых перезапусков.

6 мин чтения

Что такое CDN и как работает доставка контента

Разбираем путь запроса через CDN: DNS, edge, origin, кэш, TLS и очистку. Когда сеть ускоряет сайт, а какие проблемы она не решает.

6 мин чтения

Фотохостинг: где хранить и делиться фото

Разбираем, когда нужен публичный фотохостинг, медиатека сайта или объектное хранилище, как настроить доступ и не потерять изображения.

6 мин чтения

Пробный период VPS: тест перед покупкой

Пробный период VPS: как проверить сервер до оплаты, читать условия возврата, тестировать сеть, диск, CPU и поддержку без лишнего риска.

5 мин чтения

Хостинг для Telegram и Discord бота

Хостинг для Telegram и Discord бота: как выбрать VPS, настроить автозапуск, не переплатить за ресурсы и не потерять процесс ночью.

4 мин чтения

Домен купить: выбираем .ru, .рф или .com

Домен купить без переплаты: сравниваем .ru, .рф и .com по задаче, регистрации, продлению и рискам для российского проекта.

5 мин чтения