AllowOverride и .htaccess vs httpd.conf
Директива AllowOverride в конфиге Apache определяет, какие классы директив разрешено использовать в .htaccess. На shared-хостинге её задаёт хостинг, на VPS — вы. Эта статья разбирает все группы AllowOverride, объясняет разницу между .htaccess и блоком <Directory> в конфиге сервера, и показывает, как перенести правила из .htaccess в конфиг для ускорения и надёжности.
Что такое AllowOverride и .htaccess per-directory override
.htaccess — это файл конфигурации Apache «на уровне каталога»: он лежит рядом с файлами сайта и позволяет изменять настройки сервера без доступа к главному конфигу. Apache читает .htaccess при каждом запросе — начиная с DocumentRoot и до каталога, где лежит запрошенный файл.
Директива AllowOverride находится в конфиге Apache (в блоке <Directory> или vhost) и указывает, какие классы директив разрешено переопределять через .htaccess. Без AllowOverride с нужным значением Apache просто игнорирует соответствующие директивы в .htaccess или возвращает 500.
Пример в vhost-конфиге:
<Directory /var/www/example.com/public_html> AllowOverride All Require all granted </Directory>
Группы AllowOverride: что каждая разрешает
All— разрешает все директивы, которые допустимы в контексте.htaccess. Типично для shared-хостингов.FileInfo— директивы для управления типами и обработкой файлов:RewriteEngine,RewriteRule,RewriteCond,ErrorDocument,Header,AddType,AddHandler,Redirect,RedirectMatch,SetEnvIfи другие директивыmod_rewrite,mod_headers,mod_alias. БезFileInfo—RewriteRuleне работает в.htaccess.Options— директиваOptions(включение/выключениеIndexes,FollowSymLinks,MultiViews,ExecCGIи др.). БезOptions— директиваOptionsв.htaccessдаёт «Options not allowed here».AuthConfig— директивы авторизации:AuthType,AuthName,AuthUserFile,AuthGroupFile,Require. Нужно для парольной защиты каталогов через.htaccess.Limit— директивы управления доступом внутри блоков<Limit>и<LimitExcept>:Order/Allow/Deny(Apache 2.2 стиль),Require ipи подобные. В Apache 2.4 для IP-фильтрации в.htaccessобычно достаточноFileInfo+Limit.Indexes— директивы листинга каталогов:DirectoryIndex,IndexOptions,IndexOrderDefault,AddIconи другие директивыmod_autoindex.None—.htaccessполностью игнорируется. Типично для VPS с «голым» Apache из пакетного менеджера (без панели управления)..htaccessпри этом вообще не читается — никакие директивы не применяются.
Значения можно комбинировать: AllowOverride FileInfo Options AuthConfig Limit Indexes — это почти то же, что All, но без некоторых редких групп.
Почему конфиг сервера быстрее .htaccess
Apache читает и парсит .htaccess на каждый запрос к любому файлу в каталоге — и во всех родительских каталогах от DocumentRoot вниз. Для запроса к /blog/2024/post.html Apache читает .htaccess из корня, из /blog/ и из /blog/2024/, если они существуют. Это работа файловой системы при каждом запросе.
Директивы в блоке <Directory> конфига Apache загружаются один раз при старте (или перезапуске) сервера. Никакой работы с файловой системой при запросах — только уже разобранные в памяти правила.
Для обычного небольшого .htaccess на нагруженном сайте разница мала. Но если у вас большой .htaccess, множество правил mod_rewrite, или копии .htaccess лежат в каждой подпапке — это реальный оверхед. Подробнее о влиянии .htaccess на производительность — статья /info/htaccess-performance-myths/ и симулятор нагрузки /perf-sim/.
<Directory> в конфиге vs .htaccess: что где можно
Только в конфиге сервера (не в .htaccess):
<Directory>,<Location>,<VirtualHost>— блоки конфига.ServerName,DocumentRoot,ServerAlias— параметры vhost.LoadModule— подключение модулей.AllowOverrideсама — управляет тем, что разрешено в.htaccess.AllowOverrideList— точечное разрешение директив (Apache 2.4.9+).Listen,ServerRoot,User/Group— глобальные настройки.
В .htaccess (если AllowOverride разрешает):
RewriteEngine,RewriteRule,RewriteCond— если разрешёнFileInfo.ErrorDocument,Header,AddType— если разрешёнFileInfo.Options— если разрешёнOptions.AuthType,AuthUserFile,Require— если разрешёнAuthConfig.DirectoryIndex— если разрешёнIndexes.Order/Allow/Deny,Require ip— если разрешёнLimit.
Как перенести правила из .htaccess в <Directory>
Содержимое .htaccess можно напрямую вставить в блок <Directory> в vhost-конфиге сервера. После этого AllowOverride можно поставить в None — .htaccess будет игнорироваться (и не читаться при каждом запросе).
<VirtualHost *:80> ServerName example.com DocumentRoot /var/www/example.com/public_html <Directory /var/www/example.com/public_html> # AllowOverride None — .htaccess не читается (быстрее) AllowOverride None Require all granted # Содержимое бывшего .htaccess — вставляйте сюда: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . index.php [L] Options -Indexes ErrorDocument 404 /404.html </Directory> </VirtualHost>
После правки конфига перезапустите Apache: apachectl restart (или systemctl restart apache2 / httpd). Синтаксис конфига можно проверить командой apachectl configtest (или apachectl -t) — она не перезапускает сервер, только проверяет.
AllowOverrideList: точечное разрешение директив
Начиная с Apache 2.4.9, можно разрешить конкретные директивы при AllowOverride None, не открывая целую группу. Директива называется AllowOverrideList.
<Directory /var/www/example.com/public_html> # .htaccess вообще ничего не может... AllowOverride None # ...кроме вот этих двух директив: AllowOverrideList Redirect RedirectMatch </Directory>
Таким образом можно дать пользователю (например, на shared-хостинге с приложением) возможность добавлять только редиректы, не давая доступа ко всем директивам FileInfo.
Ошибки 500 от узкого AllowOverride
Если AllowOverride не включает нужную группу, Apache не просто игнорирует директиву — он возвращает 500 Internal Server Error с объяснением в error.log:
Options not allowed here— директиваOptions …в.htaccess, ноAllowOverrideне включаетOptions.RewriteRule not allowed here— директивыmod_rewrite(RewriteEngine,RewriteRule,RewriteCond) в.htaccess, ноAllowOverrideне включаетFileInfo.Invalid command 'Header'— аналогично: нетFileInfo, или модульmod_headersвообще не загружен.
Решение: добавить нужную группу в AllowOverride в конфиге сервера (если есть доступ к конфигу), либо убрать директиву из .htaccess и перенести её в <Directory> в конфиге. Подробнее о диагностике ошибок 500 — гид «Почему .htaccess не работает» → раздел 500.
Когда .htaccess всё-таки нужен
- Shared-хостинг — нет доступа к конфигу сервера.
.htaccess— единственный способ настроить Apache для своего сайта. Хостинг сам обеспечивает нужныйAllowOverride. - Несколько сайтов с независимыми настройками — удобно держать конфиг рядом с кодом, деплоить вместе с проектом.
- Нет доступа к панели или конфигу — даже на VPS бывают ситуации, когда изменить vhost нельзя быстро (например, панель управления не поддерживает кастомные блоки
<Directory>).
На собственном VPS или выделенном сервере — рекомендуется перенести правила в конфиг и поставить AllowOverride None. Это и быстрее, и надёжнее.
Ссылки и инструменты
- «Почему .htaccess не работает» — 500 / 403 / 404, бесконечный редирект, .htaccess игнорируется.
- «.htaccess на разных хостингах» — cPanel, ISPmanager, Plesk, Beget, LiteSpeed, nginx.
- Линтер .htaccess — проверка синтаксиса, устаревших директив.
- «Ускорение сайта через .htaccess» — кэш, gzip, ETag.
- Справочник директив — группа Core —
AllowOverride,Optionsи другие. - Симулятор нагрузки — какие правила .htaccess тяжёлые.