Запрет доступа в .htaccess: к сайту, папке, файлам и по IP
В Apache 2.4 доступ закрывают строками Require: строка Require all denied закрывает всё, строка Require ip пускает только нужные адреса. Строки ставят в .htaccess той папки, которую нужно закрыть, — они действуют на неё и на вложенные папки.
Содержание 12
Что сделать прямо сейчас
- Перед правкой сохраните копию файла .htaccess к себе на компьютер: если что-то пойдёт не так, её можно будет вернуть.
- Выберите, что нужно: закрыть папку, пустить только свой IP или закрыть отдельные файлы.
- Добавьте строки в .htaccess нужной папки. Сохраните файл и сразу откройте сайт. Если появилась ошибка 500, уберите добавленные строки — сайт заработает как раньше.
- Проверьте, что закрытый адрес отвечает 403 — как проверить.
Закрыть папку целиком
Создайте в папке файл .htaccess — или откройте, если он уже есть, — и добавьте строку:
Require all deniedВсе файлы в папке и во вложенных папках будут отвечать 403 Forbidden. Скрипты сайта по-прежнему читают эти файлы с диска: запрет действует только на запросы к сайту по адресу — из браузера, curl и других программ.
На своём VPS сначала разрешите .htaccess — как это сделать.
Пустить только свой IP
Require ip 203.0.113.10Вместо 203.0.113.10 впишите свой IP-адрес. Остальные посетители получат ответ 403.
Несколько адресов пишут в одной строке через пробел, целую сеть — с маской:
Require ip 203.0.113.10 198.51.100.7
Require ip 198.51.100.0/24Строк Require может быть несколько — посетителя пустят, если подошла любая из них. Запись /24 охватывает адреса от 198.51.100.0 до 198.51.100.255. Адреса IPv6 пишут так же: Require ip 2001:db8::/64.
Если ваш IP меняется, удобнее пароль на папку. Если сайт открывается у вас по IPv6, в правило нужен и ваш адрес IPv6.
Закрыть доступ отдельным адресам
<RequireAll>
Require all granted
Require not ip 198.51.100.0/24
</RequireAll>Внутри блока RequireAll должны выполниться все строки: пускать всех — и не пускать адреса из сети 198.51.100.0/24. Строка Require not сама по себе никого не пускает, поэтому её пишут в паре со строкой, которая пускает, внутри такого блока. Несколько адресов можно перечислить в одной строке через пробел.
Закрыть отдельные файлы
Один файл по имени:
<Files "notes.txt">
Require all denied
</Files>Все файлы с окончаниями .ini, .log и .sql:
<FilesMatch "\.(ini|log|sql)$">
Require all denied
</FilesMatch>В кавычках — шаблон имени: \. означает саму точку, в скобках через вертикальную черту перечислены окончания, $ — конец имени. Копии базы данных надёжнее держать вне папки сайта — где хранить копии.
Файлы .htaccess и .htpasswd на VPS с Ubuntu закрыты сразу: такой запрет уже есть в главном файле настроек Apache. На хостинге проверьте это через curl — как проверить. На своём VPS для блоков Files и FilesMatch в .htaccess нужно AllowOverride All — как разрешить.
Отключить список файлов
Если в папке нет индексного файла — index.html или index.php, — Apache на VPS с Ubuntu показывает список всех файлов в ней: так задано для /var/www/ в главном файле настроек. На Timeweb и Спринтхосте в таком случае приходит ответ 403. Отключить список:
Options -IndexesМинус обязателен. Строка Options без плюса и минуса заменяет весь набор настроек папки: Options Indexes включит список и при этом выключит FollowSymLinks, а без него правила RewriteRule в .htaccess перестанут работать — сайт ответит 403.
Какой файл открывать первым, задаёт строка DirectoryIndex. Apache берёт первый найденный файл, слева направо:
DirectoryIndex index.html index.phpНе пускать ботов по названию
SetEnvIfNoCase User-Agent "BadBot" bad_bot
<RequireAll>
Require all granted
Require not env bad_bot
</RequireAll>Первая строка помечает запросы, в названии программы которых есть BadBot, — без учёта больших и маленьких букв. Блок пускает всех, кроме помеченных. Вместо BadBot впишите название из журнала посещений сайта.
Не закрывайте так wget и curl: по справке Timeweb ими пользуется Cron хостинга — задания «HTTP-запрос» идут через wget. И помните, что бот может назваться как угодно — такой запрет действует только на тех, кто называет себя честно. Тот же запрет можно сделать и правилом mod_rewrite — с флагом F.
Старые строки Order, Deny и Allow
Строки Order, Deny и Allow — способ Apache 2.2. В Apache 2.4 они работают через модуль mod_access_compat, который документация называет устаревшим; Спринтхост тоже называет order устаревшим. Замените их на Require:
| Было | Стало |
|---|---|
Order deny,allow и Deny from all | Require all denied |
Order allow,deny и Allow from all | Require all granted |
Order deny,allow, Deny from all и Allow from example.com | Require host example.com |
Не смешивайте старые и новые строки в одном месте — документация Apache предупреждает, что так получается неожиданный результат. Заменяйте блок целиком.
Как проверить
В терминале компьютера (как открыть терминал, про curl) запросите закрытый адрес:
curl -I https://example.com/backup/В первой строке ответа должно стоять число 403. Если пришёл ответ 200, запрет не сработал: проверьте, в той ли папке лежит .htaccess и назван ли файл ровно .htaccess.
Проверьте и сам .htaccess:
curl -I https://example.com/.htaccessОтвет 403 или 404 — всё в порядке. Ответ 200 значит, что файл открыт всем: закройте его блоком Files, как выше.
Правило с IP проверьте так: на время впишите в строку Require ip чужой адрес, например 203.0.113.10, и откройте сайт — должен прийти ответ 403. Затем верните свой адрес.
Ошибки и как их исправить
| Что видите | Что делать |
|---|---|
| ошибка 500 после сохранения | опечатка или не закрыт блок: у <RequireAll> нужна строка </RequireAll> — разбор |
| ответ 403 приходит и вам | ваш IP другой или сменился, или вы заходите по IPv6 — добавьте свой адрес в строку Require ip |
| ответ 200 вместо 403 | файл не в той папке или назван не .htaccess; на VPS разрешите .htaccess — как |
| в папке без индексного файла виден список файлов | отключите список |
после строки Options Indexes сайт с правилами RewriteRule отвечает 403 | пишите Options со знаком: Options +Indexes или Options -Indexes |
| 403 на всём сайте | запрет попал в .htaccess корневой папки — разбор 403 |
Источники
- Документация Apache: логика Require — несколько строк Require без блока работают как RequireAny; строка с not сама доступ не даёт — её ставят в RequireAll вместе со строкой, которая пускает.
- Документация Apache: Require ip — несколько адресов в одной строке, неполные адреса, маски, CIDR и IPv6.
- Документация Apache: SetEnvIfNoCase — метка запроса по заголовку без учёта регистра.
- Документация Apache: FilesMatch — блоки Files и FilesMatch разрешены в .htaccess при AllowOverride All; шаблон имени — регулярное выражение.
- Документация Apache: Options — запись без плюса и минуса заменяет весь набор; Indexes показывает список файлов, если в папке нет индексного файла.
- Документация Apache: DirectoryIndex — Apache отдаёт первый найденный файл из списка.
- Документация Apache: переход на Apache 2.4 — таблица замены Order, Deny и Allow на Require; старые и новые строки вместе дают неожиданный результат.
- Документация Apache: mod_access_compat — строки Order, Allow и Deny; модуль устарел.
- Файл apache2.conf из пакета apache2 в Ubuntu 24.04 — для /var/www/ — Options Indexes FollowSymLinks и AllowOverride None, имя файла .htaccess, запрет на файлы .ht*.
- Исходный код Apache 2.4.58: mod_rewrite.c — без FollowSymLinks и SymLinksIfOwnerMatch mod_rewrite в .htaccess отвечает 403 и пишет в журнал AH00670.
- Timeweb: создание и настройка .htaccess — Require вместо Allow и Deny, RequireAll с Require not ip, /24 и IPv6, User-Agent, Cron через wget, без индексного файла — 403.
- Спринтхост: файл .htaccess — Require ip, order признан устаревшим, User-Agent, без индексного файла — 403.
Сверено 14 октября 2026 года.
Что почитать дальше
- Пароль на папку через .htaccessесли ваш IP меняется.
- Ошибка 403 Forbiddenкак найти причину запрета.
- Файл .htaccessчто это, как создать и не сломать сайт.
- Права на файлы сайтакакие права ставить папкам и файлам.