Ошибка 403 Forbidden: 8 способов исправить
Ошибка 403 Forbidden означает, что сервер понял запрос, но отказывается его выполнять. В отличие от 401 (нет авторизации), 403 говорит: «я знаю кто ты, но доступа нет». Это серверная политика доступа — на файлы, директории, или конкретные URL.
Рассмотрим 8 реальных причин 403 и практические решения для nginx, Apache, WordPress, а также как выявить блокировку через ModSecurity, Cloudflare WAF или rate limiting.
Что означает 403
По RFC 9110 §15.5.4, 403 означает, что сервер понимает запрос, но не авторизует его. Повторная аутентификация не поможет — решение на стороне сервера (ACL, права, политика).
8 частых причин 403
- Неправильные права файлов — 600, 640 вместо 644.
- Владелец файла не web-server user (root:root вместо www-data:www-data).
- Отсутствует index-файл в директории, а directory listing отключён.
- Блокировка в .htaccess или nginx (
deny all). - ModSecurity или WAF-правило заблокировало подозрительный запрос.
- IP-блокировка через Cloudflare, fail2ban или firewall.
- SELinux/AppArmor блокирует доступ web-сервера к файлу.
- Hotlink protection — Referer не соответствует разрешённым.
Диагностика
Всегда начинайте с логов. 403 — серверный код, причина должна быть там.
# nginx
tail -50 /var/log/nginx/error.log | grep -i "forbidden\|403"
# Apache
tail -50 /var/log/apache2/error.log
tail -50 /var/log/apache2/access.log | grep " 403 "
# ModSecurity
tail -50 /var/log/modsec_audit.log
# Проверка прав
ls -la /var/www/html/problem-file
# Должно быть: -rw-r--r-- 1 www-data www-dataИспользуйте HTTP Header Checker для проверки внешнего ответа и Security Scanner — посмотрите, не выдаёт ли сервер утечку через заголовки.
8 решений
1. Исправить права файлов
# Файлы
find /var/www/html -type f -exec chmod 644 {} \;
# Директории
find /var/www/html -type d -exec chmod 755 {} \;
# Владелец
chown -R www-data:www-data /var/www/html2. Проверить index-файл
# nginx
index index.php index.html;
# Apache
DirectoryIndex index.php index.html3. Найти блокировку в .htaccess
# Ищите:
Deny from all
Require all denied
# Замените на:
Require all granted4. nginx: deny директивы
# Проблемная строка:
location ~ \.(env|git|htaccess)$ {
deny all;
}
# Если блокировка слишком широкая — пересмотрите паттерн5. ModSecurity false positive
# Определите правило в логе:
# [id "949110"] [msg "Inbound Anomaly Score Exceeded"]
# Отключите конкретное правило для URL
SecRule REQUEST_URI "@beginsWith /api/safe-endpoint" \
"id:1001,phase:1,ctl:ruleRemoveById=949110,nolog,allow"6. Проверьте IP-блокировки
# fail2ban
fail2ban-client status
fail2ban-client unban YOUR_IP
# iptables
iptables -L -n | grep DROP
iptables -D INPUT -s BLOCKED_IP -j DROP7. SELinux context (CentOS/RHEL)
ls -Z /var/www/html/
# Должно быть httpd_sys_content_t
restorecon -Rv /var/www/html/
chcon -t httpd_sys_content_t /var/www/html/newfile.php8. WordPress
- Переименуйте
.htaccess, зайдите в Настройки → Постоянные ссылки для регенерации. - Проверьте плагины безопасности (Wordfence, iThemes) — могли заблокировать IP.
chmod 644 wp-config.php,chmod 755 wp-content/
403 на /admin или /wp-admin — что делать
Если сайт работает, но админка отдаёт 403:
- Проверьте IP allowlist в
.htaccessили nginx. - Проверьте Cloudflare Firewall Rules на admin path.
- Посмотрите fail2ban — возможно, ваш IP заблокирован после неудачных входов.
- Уточните 2FA — некоторые плагины возвращают 403 при неверном TOTP.
Часто задаваемые вопросы (FAQ)
В: В чём разница между 401 и 403?
О: 401 — «авторизуйся» (нет credentials). 403 — «у тебя нет доступа» (credentials есть, но прав недостаточно).
В: Почему после scp файл отдаёт 403?
О: Владелец по умолчанию — root. Сделайте chown www-data:www-data file && chmod 644 file.
В: Как отличить 403 от сервера и от WAF?
О: Посмотрите заголовок Server: и cf-ray. Cloudflare обычно даёт свою страницу с ID. Enterno.io HTTP Checker покажет все заголовки.
В: 403 у бота Googlebot — это плохо?
О: Критично. Google не сможет индексировать страницу. Проверьте robots.txt и WAF — убедитесь, что Googlebot (IP из официального списка) не заблокирован.
Заключение
403 — это диалог о правах доступа. Начинайте с логов, проверяйте права файлов и владельца, ищите deny-правила в .htaccess и nginx, исключайте WAF и IP-блокировки. Настройте мониторинг на expected_code=200, чтобы отлавливать 403-регрессии сразу.
Проверьте ваш сайт прямо сейчас
Проверить →