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-конфиге:

это конфиг сервера/vhost, НЕ .htaccessкопировать
<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. Без FileInfoRewriteRule не работает в .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 будет игнорироваться (и не читаться при каждом запросе).

это конфиг сервера/vhost, НЕ .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.

это конфиг сервера/vhost, НЕ .htaccessкопировать
<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. Это и быстрее, и надёжнее.